Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
548 serge 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 
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