]> pd.if.org Git - pdclib/blob - platform/example/functions/_PDCLIB/allocpages.c
Removed Cygwin platform.
[pdclib] / platform / example / functions / _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 int brk( void * );
15 void * sbrk( intptr_t );
16
17 #include <_PDCLIB_glue.h>
18
19 static void * membreak = NULL;
20
21 void * _PDCLIB_allocpages( int const n )
22 {
23     if ( membreak == NULL )
24     {
25         /* first call, make sure end-of-heap is page-aligned */
26         intptr_t unaligned = 0;
27         membreak = sbrk( 0 );
28         unaligned = _PDCLIB_PAGESIZE - (intptr_t)membreak % _PDCLIB_PAGESIZE;
29         if ( unaligned < _PDCLIB_PAGESIZE )
30         {
31             /* end-of-heap not page-aligned - adjust */
32             if ( sbrk( unaligned ) != membreak )
33             {
34                 /* error */
35                 return NULL;
36             }
37             membreak = (char *)membreak + unaligned;
38         }
39     }
40     /* increasing or decreasing heap - standard operation */
41     void * oldbreak = membreak;
42     membreak = (void *)( (char *)membreak + ( n * _PDCLIB_PAGESIZE ) );
43     if ( brk( membreak ) == 0 )
44     {
45         /* successful */
46         return oldbreak;
47     }
48     else
49     {
50         /* out of memory */
51         membreak = oldbreak;
52         return NULL;
53     }
54 }
55
56 #ifdef TEST
57 #include <_PDCLIB_test.h>
58
59 int main( void )
60 {
61 #ifndef REGTEST
62     {
63     char * startbreak = sbrk( 0 );
64     TESTCASE( _PDCLIB_allocpages( 0 ) );
65     TESTCASE( ( (char *)sbrk( 0 ) - startbreak ) <= _PDCLIB_PAGESIZE );
66     startbreak = sbrk( 0 );
67     TESTCASE( _PDCLIB_allocpages( 1 ) );
68     TESTCASE( sbrk( 0 ) == startbreak + ( 1 * _PDCLIB_PAGESIZE ) );
69     TESTCASE( _PDCLIB_allocpages( 5 ) );
70     TESTCASE( sbrk( 0 ) == startbreak + ( 6 * _PDCLIB_PAGESIZE ) );
71     TESTCASE( _PDCLIB_allocpages( -3 ) );
72     TESTCASE( sbrk( 0 ) == startbreak + ( 3 * _PDCLIB_PAGESIZE ) );
73     }
74 #endif
75     return TEST_RESULTS;
76 }
77
78 #endif