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