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