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

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

Compilation fixes

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