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