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