source: trunk/src/kernel32/os2heap.cpp@ 4

Last change on this file since 4 was 4, checked in by ktk, 26 years ago

Import

File size: 8.4 KB
Line 
1/* $Id: os2heap.cpp,v 1.1 1999-05-24 20:19:47 ktk Exp $ */
2
3/*
4 *
5 * Project Odin Software License can be found in LICENSE.TXT
6 *
7 */
8/*
9 * Heap class for OS/2
10 *
11 * Copyright 1998 Sander van Leeuwen
12 *
13 */
14#define INCL_DOSMEMMGR
15#define INCL_DOSSEMAPHORES
16#define INCL_DOSERRORS
17#include <os2.h>
18#include <builtin.h>
19#include <stdlib.h>
20#include <string.h>
21#include "win32type.h"
22#include "os2heap.h"
23#include "misc.h"
24#include "vmutex.h"
25
26#ifndef HEAP_NO_SERIALIZE
27 #define HEAP_NO_SERIALIZE 1
28#endif
29
30#ifndef HEAP_ZERO_MEMORY
31 #define HEAP_ZERO_MEMORY 8
32#endif
33
34VMutex heaplistmutex; //protects linked lists of heaps
35
36//******************************************************************************
37//******************************************************************************
38OS2Heap::OS2Heap(HANDLE hHeap, DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize)
39{
40 OS2Heap *curheap = OS2Heap::heap;
41
42 hPrimaryHeap = hHeap;
43 totalAlloc = 0;
44 fInitialized = 0;
45 nrHeaps = 0;
46 heapelem = NULL;
47
48 this->dwMaximumSize = dwMaximumSize;
49 this->dwInitialSize = dwInitialSize;
50 this->flOptions = flOptions;
51
52 dprintf(("KERNEL32: HeapCreate: initial size %d, max size %d (flags %X) returned %X\n", dwInitialSize, dwMaximumSize, flOptions, hPrimaryHeap));
53
54 if(!(flOptions & HEAP_NO_SERIALIZE)) {
55 hmutex = new VMutex();
56 dassert(hmutex, ("ERROR: new VMutex\n"));
57 }
58 else hmutex = NULL;
59
60 heaplistmutex.enter();
61 if(curheap != NULL) {
62 while(curheap->next != NULL) {
63 curheap = curheap->next;
64 }
65 curheap->next = this;
66 }
67 else heap = this;
68 next = NULL;
69
70 heaplistmutex.leave();
71}
72//******************************************************************************
73//******************************************************************************
74OS2Heap::~OS2Heap()
75{
76 OS2Heap *curheap = OS2Heap::heap;
77 HEAPELEM *hnext;
78 int i;
79
80 dprintf(("dtr OS2Heap, hPrimaryHeap = %X\n", hPrimaryHeap));
81
82 if(hmutex)
83 hmutex->enter();
84
85 while(heapelem) {
86 hnext = heapelem->next;
87 free(heapelem);
88 heapelem = hnext;
89 }
90 if(hmutex) {
91 hmutex->leave();
92 delete hmutex;
93 }
94
95 heaplistmutex.enter();
96 if(heap == this) {
97 heap = next;
98 }
99 else {
100 while(curheap->next != NULL) {
101 if(curheap->next == this) {
102 curheap->next = next;
103 break;
104 }
105 curheap = curheap->next;
106 }
107 }
108 heaplistmutex.leave();
109 dprintf(("dtr OS2Heap, hPrimaryHeap = %X done\n", hPrimaryHeap));
110}
111//******************************************************************************
112//******************************************************************************
113LPVOID OS2Heap::Alloc(DWORD dwFlags, DWORD dwBytes)
114{
115 LPVOID lpMem;
116
117// dprintf(("OS2Heap::Alloc\n"));
118 lpMem = malloc(dwBytes + HEAP_OVERHEAD);
119 if(lpMem == NULL) {
120 dprintf(("OS2Heap::Alloc, lpMem == NULL"));
121 return(NULL);
122 }
123 if(dwFlags & HEAP_ZERO_MEMORY) {
124 memset((char *)lpMem, 0, dwBytes+HEAP_OVERHEAD);
125 }
126 totalAlloc += dwBytes;
127
128 if(hmutex)
129 hmutex->enter();
130
131 if(heapelem) {
132 HEAPELEM *hnext;
133
134 hnext = heapelem;
135
136 heapelem = (HEAPELEM *)lpMem;
137 hnext->prev = heapelem;
138 heapelem->next = hnext;
139 }
140 else {
141 heapelem = (HEAPELEM *)lpMem;
142 heapelem->next = NULL;
143 }
144 heapelem->prev = NULL;
145 heapelem->flags = 0; //only used when allocated with LocalAlloc
146 heapelem->lockCnt = 0; //.. ..
147
148 if(hmutex) {
149 hmutex->leave();
150 }
151 return(LPVOID)((char *)lpMem+sizeof(HEAPELEM));
152}
153//******************************************************************************
154//******************************************************************************
155LPVOID OS2Heap::Alloc(DWORD dwFlags, DWORD dwBytes, DWORD LocalAllocFlags)
156{
157 HEAPELEM *helem;
158 LPVOID lpMem = Alloc(dwFlags, dwBytes);
159
160 if(lpMem == NULL)
161 return(NULL);
162
163 helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
164 helem->flags = LocalAllocFlags;
165 return(lpMem);
166}
167//******************************************************************************
168//******************************************************************************
169BOOL OS2Heap::Lock(LPVOID lpMem)
170{
171 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
172
173 if(lpMem == NULL)
174 return(FALSE);
175
176 helem->lockCnt++;
177
178 return(TRUE);
179}
180//******************************************************************************
181//******************************************************************************
182BOOL OS2Heap::Unlock(LPVOID lpMem)
183{
184 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
185
186 if(lpMem == NULL)
187 return(FALSE);
188
189 if(helem->lockCnt == 0)
190 return(FALSE);
191
192 helem->lockCnt--;
193
194 return(TRUE);
195}
196//******************************************************************************
197//******************************************************************************
198DWORD OS2Heap::GetFlags(LPVOID lpMem)
199{
200 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
201
202 if(lpMem == NULL)
203 return(FALSE);
204
205 return(helem->flags);
206}
207//******************************************************************************
208//******************************************************************************
209int OS2Heap::GetLockCnt(LPVOID lpMem)
210{
211 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
212
213 if(lpMem == NULL)
214 return(666);
215
216 return(helem->lockCnt);
217}
218//******************************************************************************
219//******************************************************************************
220LPVOID OS2Heap::ReAlloc(DWORD dwFlags, LPVOID lpMem, DWORD dwBytes)
221{
222 LPVOID lpNewMem;
223 int i;
224
225// dprintf(("OS2Heap::ReAlloc %X %X %d\n", dwFlags, lpMem, dwBytes));
226 lpNewMem = Alloc(dwFlags, dwBytes);
227 memcpy(lpNewMem, lpMem, Size(0, lpMem));
228 Free(0, lpMem);
229
230 dassert(lpNewMem, ("OS2Heap::ReAlloc, no more memory left\n"));
231
232 return(lpNewMem);
233}
234//******************************************************************************
235//******************************************************************************
236BOOL OS2Heap::Free(DWORD dwFlags, LPVOID lpMem)
237{
238 HEAPELEM *helem = (HEAPELEM *)((char *)lpMem - sizeof(HEAPELEM));
239
240 if(lpMem == NULL) {
241 dprintf(("OS2Heap::Free lpMem == NULL\n"));
242 return(FALSE);
243 }
244#ifdef DEBUG1
245 int size = Size(0, lpMem);
246 dprintf(("OS2Heap::Free lpMem = %X, size %d\n", lpMem, size));
247 totalAlloc -= size;
248#endif
249 if(hmutex)
250 hmutex->enter();
251
252 if(helem->prev)
253 helem->prev->next = helem->next;
254 if(helem->next)
255 helem->next->prev = helem->prev;
256 if(heapelem == helem)
257 heapelem = heapelem->next;
258
259 if(hmutex) {
260 hmutex->leave();
261 }
262
263 free((void *)helem);
264 return(TRUE);
265}
266//******************************************************************************
267//******************************************************************************
268DWORD OS2Heap::Size(DWORD dwFlags, PVOID lpMem)
269{
270// dprintf(("OS2Heap::Size, %X\n", lpMem));
271 if(lpMem == NULL)
272 return(0);
273
274 return(_msize((char *)lpMem - sizeof(HEAPELEM)) - HEAP_OVERHEAD);
275}
276//******************************************************************************
277//******************************************************************************
278DWORD OS2Heap::Compact(DWORD dwFlags)
279{
280 dprintf(("OS2Heap::Compact, %X- stub\n", dwFlags));
281 return(0);
282}
283//******************************************************************************
284//******************************************************************************
285BOOL OS2Heap::Validate(DWORD dwFlags, LPCVOID lpMem)
286{
287 dprintf(("OS2Heap::Validate, %X %X - stub? (TRUE)\n", dwFlags, lpMem));
288 return(TRUE);
289}
290//******************************************************************************
291//******************************************************************************
292BOOL OS2Heap::Walk(void *lpEntry)
293{
294 dprintf(("OS2Heap::Walk, %X - stub? (TRUE)\n", lpEntry));
295 return(TRUE);
296}
297//******************************************************************************
298//******************************************************************************
299OS2Heap *OS2Heap::find(HANDLE hHeap)
300{
301 OS2Heap *curheap = OS2Heap::heap;
302
303 while(curheap != NULL) {
304 if(curheap->hPrimaryHeap == hHeap) {
305 return(curheap);
306 }
307 curheap = curheap->next;
308 }
309 dprintf(("Heap %X not found!\n", hHeap));
310 return(NULL);
311}
312//******************************************************************************
313//******************************************************************************
314OS2Heap *OS2Heap::heap = NULL;
Note: See TracBrowser for help on using the repository browser.