brk.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:3k
源码类别:

DVD

开发平台:

Others

  1. /*
  2.  * Paradigm C/C++ Run-Time Library - Version 5.0
  3.  *
  4.  * Copyright (c) 1998 Paradigm Systems.  All rights reserved.
  5.  * Portions Copyright (c) 1996 Borland International.
  6.  *
  7.  * $Revision: 2 $
  8.  * $Workfile: brk.c $
  9.  *
  10.  * function(s)
  11.  *   brk    - memory model dependent hook to _brk or __brk
  12.  *   sbrk   - memory model dependent hook to _sbrk or __sbrk
  13.  *   __brk  - changes data-segment space allocation on the near heap
  14.  *   __sbrk - changes data-segment space allocation on the near heap
  15.  */
  16. #include "Config.h" // Global Configuration - do not remove!
  17. #pragma inline
  18. #include "ServicesIncludeasmrules.h"
  19. #include <alloc.h>
  20. #include <errno.h>
  21. #include "ServicesInclude_heap.h"
  22. #pragma codeseg _TEXT "CODE"
  23. #pragma alias ( ___brk, __RtlBrk )
  24. #pragma alias ( ___sbrk, __RtlSbrk )
  25. /*--------------------------------------------------------------------------*
  26. Name            __brk - changes data-segment space allocation on the near heap
  27. Usage           int __brk(void *endds);
  28. Prototype in    alloc.h
  29. Description     __brk sets the break value to endds and changes the
  30.                 allocated space accordingly
  31. Return value    success : 0
  32.                 failure : -1 and errno set to ENOMEM (Not enough core)
  33. *---------------------------------------------------------------------------*/
  34. int __near _RtlBrk( void * __near addr )
  35. {
  36. unsigned int heaplimit,brklvl;
  37. heaplimit = ((struct POOL __near *)_heapbase)->heaplimit;
  38. asm     mov     ax, addr
  39. asm     mov     dx, heaplimit
  40. asm     cmp     ax, dx
  41. asm     jnb     brkerr
  42. asm     mov    brklvl, ax
  43. ((struct POOL __near*)_heapbase)->brklvl = brklvl;
  44. return 0 ;
  45. brkerr:
  46. errno = ENOMEM ;
  47. return -1 ;
  48. }
  49. /*--------------------------------------------------------------------------*
  50. Name            __sbrk - changes data-segment space allocation on the near heap
  51. Usage           void *__sbrk(long incr);
  52. Prototype in    alloc.h
  53. Description     sbrk adds incr bytes to the break value and changes the
  54.                 allocated space accordingly. incr can be negative, in
  55.                 which case the amount of allocated space is decreased.
  56. Return value    success : the old break value
  57.                 failure : -1 and errno set to ENOMEM (Not enough core)
  58. *---------------------------------------------------------------------------*/
  59. void * __near _RtlSbrk( long incr )
  60. {
  61. unsigned int brklvl = ((struct POOL __near*)_heapbase)->brklvl;
  62. unsigned int heaplimit = ((struct POOL __near*)_heapbase)->heaplimit;
  63. asm     mov     ax, W0(incr)
  64. asm     mov     dx, W1(incr)
  65. asm     add      ax, brklvl
  66. asm     adc     dx, 0
  67. asm     mov     cx, ax
  68. asm     or      dx, dx
  69. asm     jnz     sbrkErr
  70. asm    cmp    cx, heaplimit
  71. asm     jnb     sbrkErr
  72. asm     xchg    brklvl, ax
  73. asm    push ax
  74. ((struct POOL __near*)_heapbase)->brklvl = brklvl;
  75. asm    pop ax
  76.    return (void *) _AX ;
  77. sbrkErr:
  78. errno = ENOMEM ;
  79. return ( (void *) -1 ) ;
  80. }
  81. /*--------------------------------------------------------------------------*
  82.    In the small data models brk and sbrk are hooks to __brk and
  83.    __sbrk respectively.  __brk and __sbrk work with the near heap
  84.    by altering the value of __brklvl, the break level.
  85. *---------------------------------------------------------------------------*/
  86. int brk( void* addr )
  87. {
  88. return __brk( addr ) ;
  89. }
  90. void* sbrk( int incr )
  91. {
  92. return __sbrk( (long) incr ) ;
  93. }