home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * $Source: /unixb/home/unixlib/source/unixlib37/src/sys/c/RCS/brk,v $
- * $Date: 1996/05/06 09:01:34 $
- * $Revision: 1.2 $
- * $State: Rel $
- * $Author: unixlib $
- *
- * $Log: brk,v $
- * Revision 1.2 1996/05/06 09:01:34 unixlib
- * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
- * Saved for 3.7a release.
- *
- * Revision 1.1 1996/04/19 21:34:24 simon
- * Initial revision
- *
- ***************************************************************************/
-
- /****************************************************************************
- *
- * Memory is layed out in one of two ways, depending whether we are using
- * a RISC OS 3.5+ dynamic area for the heap. If a dynamic area is being
- * used then __dynamic_num != -1.
- *
- * Case 1: No dynamic area
- *
- * +-------+-------------+ +--------+
- * | | heap -> | ....... | |
- * +-------+-------------+ +--------+
- * ^ ^ ^-> <-^ ^
- * __base __rwlimit __break __stack __himem
- * __lomem __stack_limit
- *
- *
- * Case 2: Heap in dynamic area
- * /
- * +-------+ +--------+ / +-------------+
- * | | ....... | | \ | heap -> | ......
- * +-------+ +--------+ / +-------------+
- * ^ ^ <-^ ^ / ^ ^->
- * __base __rwlimit __stack __himem __lomem __break
- * __stack_limit
- *
- ***************************************************************************/
-
- static const char rcs_id[] = "$Id: brk,v 1.2 1996/05/06 09:01:34 unixlib Rel $";
-
- #include <string.h>
- #include <errno.h>
- #include <unistd.h>
-
- #include <sys/syslib.h>
- #include <sys/swis.h>
-
- #define align(x) ((void *)(((unsigned int)(x) + 3) & ~3))
-
- /* don't shrink area since userland can call brk aswell as malloc/free */
- int
- brk (void *addr)
- {
- addr = align (addr);
-
- if (addr > __break)
- sbrk ((int) ((char *) addr - (char *) __break));
-
- if (addr < __lomem || addr > __break)
- {
- errno = ENOMEM;
- return (-1);
- }
- return (0);
- }
-
- /* don't shrink area since userland can call sbrk aswell as malloc/free */
- void *
- sbrk (int incr)
- {
- register void *addr, *rval;
- int regs[10];
-
- rval = __break;
- addr = align ((void *) ((char *) __break + incr));
-
- if (__dynamic_num != -1)
- {
- if (addr > __break)
- {
- regs[0] = __dynamic_num;
- regs[1] = (int) ((char *) addr - (char *) __break);
- if (os_swi (OS_ChangeDynamicArea, regs))
- {
- errno = ENOMEM;
- return ((void *) -1);
- }
- __break = (char *) __break + (unsigned int) regs[1];
- }
- }
-
- /* heap is below stack, so make sure we don't run into the stack */
- else
- {
- if (addr < __lomem || addr > __stack)
- {
- errno = ENOMEM;
- return ((void *) -1);
- }
- __stack_limit = addr;
- __break = addr;
- }
-
- return (rval);
- }
-