xref: /plan9/sys/src/libc/9sys/sbrk.c (revision 5e91980f0bca263e952809e3dc0cfc5dde74b999)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier extern	char	end[];
53e12c5d1SDavid du Colombier static	char	*bloc = { end };
63e12c5d1SDavid du Colombier extern	int	brk_(void*);
73e12c5d1SDavid du Colombier 
8219b2ee8SDavid du Colombier enum
9219b2ee8SDavid du Colombier {
10219b2ee8SDavid du Colombier 	Round	= 7
11219b2ee8SDavid du Colombier };
12219b2ee8SDavid du Colombier 
133e12c5d1SDavid du Colombier int
brk(void * p)143e12c5d1SDavid du Colombier brk(void *p)
153e12c5d1SDavid du Colombier {
16*5e91980fSDavid du Colombier 	uintptr bl;
173e12c5d1SDavid du Colombier 
18*5e91980fSDavid du Colombier 	bl = ((uintptr)p + Round) & ~Round;
19219b2ee8SDavid du Colombier 	if(brk_((void*)bl) < 0)
203e12c5d1SDavid du Colombier 		return -1;
21219b2ee8SDavid du Colombier 	bloc = (char*)bl;
223e12c5d1SDavid du Colombier 	return 0;
233e12c5d1SDavid du Colombier }
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier void*
sbrk(ulong n)263e12c5d1SDavid du Colombier sbrk(ulong n)
273e12c5d1SDavid du Colombier {
28*5e91980fSDavid du Colombier 	uintptr bl;
293e12c5d1SDavid du Colombier 
30*5e91980fSDavid du Colombier 	bl = ((uintptr)bloc + Round) & ~Round;
31219b2ee8SDavid du Colombier 	if(brk_((void*)(bl+n)) < 0)
323e12c5d1SDavid du Colombier 		return (void*)-1;
33219b2ee8SDavid du Colombier 	bloc = (char*)bl + n;
34219b2ee8SDavid du Colombier 	return (void*)bl;
353e12c5d1SDavid du Colombier }
36