]> pd.if.org Git - pdclib/blob - platform/example/functions/_PDCLIB/_PDCLIB_allocpages.c
Inlined some of the Cygwin patches. Not nice, but useful as I keep switching platforms.
[pdclib] / platform / example / functions / _PDCLIB / _PDCLIB_allocpages.c
1 /* _PDCLIB_allocpages( int const )
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 /* This is an example implementation of _PDCLIB_allocpages() (declared in
8    _PDCLIB_config.h), fit for use with POSIX kernels.
9 */
10
11 #include <stdint.h>
12 #include <stddef.h>
13
14 #ifndef REGTEST
15
16 int brk( void * );
17 void * sbrk( intptr_t );
18
19 #include "_PDCLIB_glue.h"
20
21 static void * membreak = NULL;
22
23 void * _PDCLIB_allocpages( int const n )
24 {
25     if ( membreak == NULL )
26     {
27         /* first call, make sure end-of-heap is page-aligned */
28         intptr_t unaligned = 0;
29         membreak = sbrk( 0 );
30         unaligned = _PDCLIB_PAGESIZE - (intptr_t)membreak % _PDCLIB_PAGESIZE;
31         if ( unaligned < _PDCLIB_PAGESIZE )
32         {
33             /* end-of-heap not page-aligned - adjust */
34             if ( sbrk( unaligned ) != membreak )
35             {
36                 /* error */
37                 return NULL;
38             }
39             membreak = (char *)membreak + unaligned;
40         }
41     }
42     /* increasing or decreasing heap - standard operation */
43     void * oldbreak = membreak;
44     membreak = (void *)( (char *)membreak + ( n * _PDCLIB_PAGESIZE ) );
45 #ifdef __CYGWIN__
46     if ( sbrk( (char*)membreak - (char*)oldbreak ) == membreak )
47 #else
48     if ( brk( membreak ) == 0 )
49 #endif
50     {
51         /* successful */
52         return oldbreak;
53     }
54     else
55     {
56         /* out of memory */
57         membreak = oldbreak;
58         return NULL;
59     }
60 }
61
62 #endif
63
64 #ifdef TEST
65
66 #include "_PDCLIB_test.h"
67
68 int main( void )
69 {
70 #ifndef REGTEST
71     char * startbreak = sbrk( 0 );
72     TESTCASE( _PDCLIB_allocpages( 0 ) );
73     TESTCASE( ( (char *)sbrk( 0 ) - startbreak ) <= _PDCLIB_PAGESIZE );
74     startbreak = sbrk( 0 );
75     TESTCASE( _PDCLIB_allocpages( 1 ) );
76     TESTCASE( sbrk( 0 ) == startbreak + ( 1 * _PDCLIB_PAGESIZE ) );
77     TESTCASE( _PDCLIB_allocpages( 5 ) );
78     TESTCASE( sbrk( 0 ) == startbreak + ( 6 * _PDCLIB_PAGESIZE ) );
79     TESTCASE( _PDCLIB_allocpages( -3 ) );
80     TESTCASE( sbrk( 0 ) == startbreak + ( 3 * _PDCLIB_PAGESIZE ) );
81 #endif
82     return TEST_RESULTS;
83 }
84
85 #endif