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

Last change on this file since 46 was 46, checked in by sandervl, 26 years ago

* empty log message *

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