home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / unix / unixlib_1 / !UnixLib37_src_sys_c_brk < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-09  |  2.9 KB  |  113 lines

  1. /****************************************************************************
  2.  *
  3.  * $Source: /unixb/home/unixlib/source/unixlib37/src/sys/c/RCS/brk,v $
  4.  * $Date: 1996/05/06 09:01:34 $
  5.  * $Revision: 1.2 $
  6.  * $State: Rel $
  7.  * $Author: unixlib $
  8.  *
  9.  * $Log: brk,v $
  10.  * Revision 1.2  1996/05/06 09:01:34  unixlib
  11.  * Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
  12.  * Saved for 3.7a release.
  13.  *
  14.  * Revision 1.1  1996/04/19 21:34:24  simon
  15.  * Initial revision
  16.  *
  17.  ***************************************************************************/
  18.  
  19. /****************************************************************************
  20.  *
  21.  * Memory is layed out in one of two ways, depending whether we are using
  22.  * a RISC OS 3.5+ dynamic area for the heap. If a dynamic area is being
  23.  * used then __dynamic_num != -1.
  24.  *
  25.  * Case 1: No dynamic area
  26.  *
  27.  *    +-------+-------------+         +--------+
  28.  *    |       | heap ->     | ....... |        |
  29.  *    +-------+-------------+         +--------+
  30.  *    ^       ^             ^->     <-^        ^
  31.  * __base  __rwlimit     __break   __stack  __himem
  32.  *         __lomem       __stack_limit
  33.  *
  34.  *
  35.  * Case 2: Heap in dynamic area
  36.  *                                        /
  37.  *    +-------+          +--------+      /      +-------------+
  38.  *    |       |  ....... |        |      \      | heap ->     | ......
  39.  *    +-------+          +--------+      /      +-------------+
  40.  *    ^       ^        <-^        ^     /       ^             ^->
  41.  * __base  __rwlimit  __stack  __himem       __lomem       __break
  42.  *         __stack_limit
  43.  *
  44.  ***************************************************************************/
  45.  
  46. static const char rcs_id[] = "$Id: brk,v 1.2 1996/05/06 09:01:34 unixlib Rel $";
  47.  
  48. #include <string.h>
  49. #include <errno.h>
  50. #include <unistd.h>
  51.  
  52. #include <sys/syslib.h>
  53. #include <sys/swis.h>
  54.  
  55. #define align(x) ((void *)(((unsigned int)(x) + 3) & ~3))
  56.  
  57. /* don't shrink area since userland can call brk aswell as malloc/free */
  58. int
  59. brk (void *addr)
  60. {
  61.   addr = align (addr);
  62.  
  63.   if (addr > __break)
  64.     sbrk ((int) ((char *) addr - (char *) __break));
  65.  
  66.   if (addr < __lomem || addr > __break)
  67.     {
  68.       errno = ENOMEM;
  69.       return (-1);
  70.     }
  71.   return (0);
  72. }
  73.  
  74. /* don't shrink area since userland can call sbrk aswell as malloc/free */
  75. void *
  76. sbrk (int incr)
  77. {
  78.   register void *addr, *rval;
  79.   int regs[10];
  80.  
  81.   rval = __break;
  82.   addr = align ((void *) ((char *) __break + incr));
  83.  
  84.   if (__dynamic_num != -1)
  85.     {
  86.       if (addr > __break)
  87.     {
  88.       regs[0] = __dynamic_num;
  89.       regs[1] = (int) ((char *) addr - (char *) __break);
  90.       if (os_swi (OS_ChangeDynamicArea, regs))
  91.         {
  92.           errno = ENOMEM;
  93.           return ((void *) -1);
  94.         }
  95.       __break = (char *) __break + (unsigned int) regs[1];
  96.     }
  97.     }
  98.  
  99.   /* heap is below stack, so make sure we don't run into the stack */
  100.   else
  101.     {
  102.       if (addr < __lomem || addr > __stack)
  103.     {
  104.       errno = ENOMEM;
  105.       return ((void *) -1);
  106.     }
  107.       __stack_limit = addr;
  108.       __break = addr;
  109.     }
  110.  
  111.   return (rval);
  112. }
  113.