Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /****************************************************************************
  2. *
  3. *                            Open Watcom Project
  4. *
  5. *    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
  6. *
  7. *  ========================================================================
  8. *
  9. *    This file contains Original Code and/or Modifications of Original
  10. *    Code as defined in and that are subject to the Sybase Open Watcom
  11. *    Public License version 1.0 (the 'License'). You may not use this file
  12. *    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
  13. *    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
  14. *    provided with the Original Code and Modifications, and is also
  15. *    available at www.sybase.com/developer/opensource.
  16. *
  17. *    The Original Code and all software distributed under the License are
  18. *    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  19. *    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
  20. *    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
  21. *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
  22. *    NON-INFRINGEMENT. Please see the License for the specific language
  23. *    governing rights and limitations under the License.
  24. *
  25. *  ========================================================================
  26. *
  27. * Description:  Heap library configuration for various platforms.
  28. *
  29. ****************************************************************************/
  30.  
  31.  
  32. #include "variety.h"
  33.  
  34. #if defined(_M_IX86)
  35.     #include <i86.h>
  36. #endif
  37.  
  38. #if !defined(__DOS_EXT__)
  39. #if defined(__386__) &&                 \
  40.    !defined(__WINDOWS_386__) &&         \
  41.    !defined(__WINDOWS__) &&             \
  42.    !defined(__OS2__) &&                 \
  43.    !defined(__NT__) &&                  \
  44.    !defined(__OSI__) &&                 \
  45.    !defined(__UNIX__)
  46. #define __DOS_EXT__
  47. #endif
  48. #endif
  49.  
  50. typedef unsigned int                tag;
  51. typedef struct freelistp            frl;
  52. typedef struct freelistp _WCNEAR    *frlptr;
  53. typedef struct freelist _WCFAR      *farfrlptr;
  54. typedef unsigned char _WCNEAR       *PTR;
  55. typedef unsigned char _WCFAR        *FARPTR;
  56. typedef struct miniheapblkp _WCNEAR *mheapptr;
  57.  
  58. /*
  59. ** NOTE: the size of these data structures is critical to the alignemnt
  60. **       of the pointers returned by malloc().
  61. */
  62. struct freelist {
  63.     tag                 len;    /* length of block in free list */
  64.     unsigned int        prev;   /* offset of previous block in free list */
  65.     unsigned int        next;   /* offset of next block in free list */
  66. };
  67. struct heapblk {
  68.     tag                 heaplen;        /* size of heap (0 = 64K) */
  69.     unsigned int        prevseg;        /* segment selector for previous heap */
  70.     unsigned int        nextseg;        /* segment selector for next heap */
  71.     unsigned int        rover;          /* roving pointer into free list */
  72.     unsigned int        b4rover;        /* largest block before rover */
  73.     unsigned int        largest_blk;    /* largest block in the heap  */
  74.     unsigned int        numalloc;       /* number of allocated blocks in heap */
  75.     unsigned int        numfree;        /* number of free blocks in the heap */
  76.     struct freelist     freehead;       /* listhead of free blocks in heap */
  77. };
  78.  
  79. struct freelistp {
  80.     tag                 len;
  81.     frlptr              prev;
  82.     frlptr              next;
  83. };
  84. struct heapblkp {
  85.     tag                 heaplen;
  86.     unsigned int        prevseg;
  87.     unsigned int        nextseg;
  88.     frlptr              rover;
  89.     unsigned int        b4rover;
  90.     unsigned int        largest_blk;
  91.     unsigned int        numalloc;
  92.     unsigned int        numfree;
  93.     frl                 freehead;
  94. };
  95.  
  96. struct miniheapblkp {
  97.     tag                 len;
  98.     mheapptr            prev;
  99.     mheapptr            next;
  100.     frlptr              rover;
  101.     unsigned int        b4rover;
  102.     unsigned int        largest_blk;
  103.     unsigned int        numalloc;
  104.     unsigned int        numfree;
  105.     frl                 freehead;
  106. };
  107.  
  108. struct heapstart {
  109.     struct heapblk      h;
  110.     struct freelist     first;
  111. };
  112.  
  113. struct heapend {
  114.     tag                 last_tag;
  115.     struct freelist     last;
  116. };
  117.  
  118. #ifdef __DOS_EXT__
  119. struct dpmi_hdr {
  120.     unsigned long       dpmi_handle;
  121.     tag                 dos_seg_value;  // 0 => DPMI block, else DOS segment
  122. };
  123. #endif
  124.  
  125. extern unsigned                         _curbrk;
  126. extern mheapptr _WCNEAR                 __nheapbeg;
  127. #if defined(_M_IX86)
  128. extern __segment                        __fheap;
  129. extern __segment                        __bheap;
  130. extern __segment                        __fheapRover;
  131. #endif
  132. extern int                              __heap_enabled;
  133. extern unsigned int                     __LargestSizeB4Rover;
  134. extern struct miniheapblkp _WCNEAR      *__MiniHeapRover;
  135. extern unsigned int                     __LargestSizeB4MiniHeapRover;
  136. extern struct miniheapblkp _WCNEAR      *__MiniHeapFreeRover;
  137.  
  138. extern size_t __LastFree( void );
  139. extern int __NHeapWalk( struct _heapinfo *entry, mheapptr heapbeg );
  140. extern int __ExpandDGROUP( unsigned int __amt );
  141. #if defined(_M_IX86)
  142. extern unsigned __AllocSeg( unsigned int __amt );
  143. extern unsigned __GrowSeg( __segment __seg, unsigned int __amt );
  144. extern int      __FreeSeg( __segment seg );
  145. extern int __HeapWalk( struct _heapinfo *entry, __segment seg, unsigned all );
  146. extern int __HeapMin( __segment seg, unsigned one_seg );
  147. extern int __HeapSet( __segment seg, unsigned fill );
  148. #endif
  149.  
  150. #if defined(__DOS_EXT__)
  151. extern void __FreeDPMIBlocks( void );
  152. extern void *__ReAllocDPMIBlock( frlptr p1, unsigned req_size );
  153. extern void *__ExpandDPMIBlock( frlptr, unsigned );
  154. #endif
  155.  
  156. extern int __HeapManager_expand( __segment seg, unsigned offset,
  157.                             size_t req_size, size_t *growth_size );
  158.  
  159. extern void _WCFAR __HeapInit( void _WCNEAR *start, unsigned int amount );
  160.  
  161. _WCRTLINK extern void _WCNEAR *__brk( unsigned );
  162.  
  163. #if defined(_M_IX86)
  164.  #define _DGroup()      FP_SEG((&__nheapbeg))
  165. #else
  166.  #define _DGroup()      0
  167. #endif
  168. // __IsCtsNHeap() is used to determine whether the operating system provides
  169. // a continuous near heap block. __ExpandDGroup should slice for more near
  170. // heap under those operating systems with __IsCtsNHeap() == 1.
  171. #if defined(__WARP__) ||        \
  172.     defined(__NT__) ||          \
  173.     defined(__WINDOWS_386__) || \
  174.     defined(__WINDOWS_286__)
  175.  #define __IsCtsNHeap() 0
  176. #elif defined(__DOS_EXT__)
  177.  #define __IsCtsNHeap() ((_IsRationalZeroBase() || _IsCodeBuilder()) ? 0 : 1)
  178. #else
  179.  #define __IsCtsNHeap() 1
  180. #endif
  181.  
  182. extern  unsigned __MemAllocator( unsigned __sz, unsigned __seg, unsigned __off );
  183. extern  void     __MemFree( unsigned __ptr, unsigned __seg, unsigned __off );
  184. #if defined(_M_IX86)
  185.  #if defined(__386__)
  186.   #pragma aux __MemAllocator "*" parm [eax] [edx] [ebx];
  187.   #pragma aux __MemFree      "*" parm [eax] [edx] [ebx];
  188.  #else
  189.   #pragma aux __MemAllocator "*" parm [ax] [dx] [bx];
  190.   #pragma aux __MemFree      "*" parm [ax] [dx] [bx];
  191.  #endif
  192. #endif
  193.  
  194. #define PARAS_IN_64K    (0x1000)
  195. #define END_TAG         (~0)
  196.  
  197. #define TAG_SIZE        (sizeof(tag))
  198. #if defined(M_I86)
  199.     #define ROUND_SIZE  (TAG_SIZE-1)
  200. #else
  201.     #define ROUND_SIZE  (TAG_SIZE+TAG_SIZE-1)
  202. #endif
  203. #define FRL_SIZE        ((sizeof(frl)+ROUND_SIZE)&~ROUND_SIZE)
  204.  
  205. #define __HM_SUCCESS    0
  206. #define __HM_FAIL       1
  207. #define __HM_TRYGROW    2
  208.