Subversion Repositories HelenOS

Rev

Rev 978 | Rev 999 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 978 Rev 985
Line 27... Line 27...
27
 */
27
 */
28
 
28
 
29
#include <libc.h>
29
#include <libc.h>
30
#include <unistd.h>
30
#include <unistd.h>
31
 
31
 
-
 
32
/** Mremap syscall */
32
void *mremap(void *address, size_t size, unsigned long flags)
33
void *mremap(void *address, size_t size, unsigned long flags)
33
{
34
{
34
    return (void *) __SYSCALL3(SYS_MREMAP, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags);
35
    return (void *) __SYSCALL3(SYS_MREMAP, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags);
35
}
36
}
-
 
37
 
-
 
38
 
-
 
39
static size_t heapsize = 0;
-
 
40
/* Start of heap linker symbol */
-
 
41
extern char _heap;
-
 
42
 
-
 
43
/** Sbrk emulation
-
 
44
 *
-
 
45
 * @param size New area that should be allocated or negative,
-
 
46
               if it should be shrinked
-
 
47
 * @return Pointer to newly allocated area
-
 
48
 */
-
 
49
void *sbrk(ssize_t incr)
-
 
50
{
-
 
51
    void *res;
-
 
52
    /* Check for invalid values */
-
 
53
    if (incr < 0 && -incr > heapsize)
-
 
54
        return NULL;
-
 
55
    /* Check for too large value */
-
 
56
    if (incr > 0 && incr+heapsize < heapsize)
-
 
57
        return NULL;
-
 
58
    /* Check for too small values */
-
 
59
    if (incr < 0 && incr+heapsize > heapsize)
-
 
60
        return NULL;
-
 
61
 
-
 
62
    res = mremap(&_heap, heapsize + incr,0);
-
 
63
    if (!res)
-
 
64
        return NULL;
-
 
65
    res = (void *)&_heap + incr;
-
 
66
    heapsize += incr;
-
 
67
    return res;
-
 
68
}