source: trunk/src/kernel32/heap.cpp@ 511

Last change on this file since 511 was 469, checked in by phaller, 26 years ago

Add: slight restructuring and LZ32 support

File size: 12.7 KB
Line 
1/* $Id: heap.cpp,v 1.11 1999-08-10 12:43:22 phaller Exp $ */
2
3/*
4 * Project Odin Software License can be found in LICENSE.TXT
5 *
6 * Win32 heap API functions for OS/2
7 *
8 * Copyright 1998 Sander van Leeuwen
9 *
10 */
11
12#include <os2win.h>
13#include <stdlib.h>
14#include <string.h>
15#include <misc.h>
16#define _WIN32
17#include "os2heap.h"
18#include <odincrt.h>
19#include <heap.h>
20
21static HANDLE processheap = NULL;
22OS2Heap *OS2ProcessHeap = NULL;
23
24//******************************************************************************
25//******************************************************************************
26LPVOID WIN32API HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)
27{
28 OS2Heap *curheap = OS2Heap::find(hHeap);
29
30// dprintf(("HeapAlloc %X bytes", dwBytes));
31 if(curheap == NULL)
32 return(NULL);
33
34 return(curheap->Alloc(dwFlags, dwBytes));
35}
36//******************************************************************************
37//******************************************************************************
38LPVOID WIN32API HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, DWORD dwBytes)
39{
40 OS2Heap *curheap = OS2Heap::find(hHeap);
41
42 if(curheap == NULL)
43 return(NULL);
44
45 return(curheap->ReAlloc(dwFlags, lpMem, dwBytes));
46}
47//******************************************************************************
48//******************************************************************************
49BOOL WIN32API HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
50{
51 OS2Heap *curheap = OS2Heap::find(hHeap);
52
53 if(curheap == NULL)
54 return(FALSE);
55
56 return(curheap->Free(dwFlags, lpMem));
57}
58//******************************************************************************
59//******************************************************************************
60HANDLE WIN32API HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize)
61{
62 OS2Heap *curheap;
63
64 //Create Open32 heap for it's handle
65 HANDLE hHeap = O32_HeapCreate(flOptions, 0, 4096);
66 if(hHeap == NULL)
67 return(NULL);
68
69 ODIN_FS_BEGIN
70 curheap = new OS2Heap(hHeap, flOptions, dwInitialSize, dwMaximumSize);
71 ODIN_FS_END
72
73 if(curheap == NULL)
74 {
75 O32_HeapDestroy(hHeap);
76 return(NULL);
77 }
78
79 if(curheap->getHeapHandle() == NULL)
80 {
81 O32_HeapDestroy(hHeap);
82 ODIN_delete(curheap);
83 return(NULL);
84 }
85 return(curheap->getHeapHandle());
86}
87//******************************************************************************
88//******************************************************************************
89BOOL WIN32API HeapDestroy(HANDLE hHeap)
90{
91 OS2Heap *curheap = OS2Heap::find(hHeap);
92
93 if(curheap == NULL)
94 return(FALSE);
95
96 O32_HeapDestroy(curheap->getHeapHandle());
97 ODIN_delete(curheap);
98 return(TRUE);
99}
100//******************************************************************************
101//******************************************************************************
102DWORD WIN32API HeapSize(HANDLE hHeap, DWORD arg2, PVOID arg3)
103{
104 OS2Heap *curheap = OS2Heap::find(hHeap);
105
106 if(curheap == NULL)
107 return(0);
108 return curheap->Size(arg2, arg3);
109}
110//******************************************************************************
111//TODO: Check this!!!
112//******************************************************************************
113DWORD WIN32API HeapCompact(HANDLE hHeap, DWORD dwFlags)
114{
115 dprintf(("KERNEL32: HeapCompact: Unknown API - stub\n"));
116 return(0);
117}
118//******************************************************************************
119//******************************************************************************
120BOOL WIN32API HeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
121{
122 dprintf(("KERNEL32: HeapValidate - stub\n"));
123 return(TRUE);
124}
125//******************************************************************************
126//******************************************************************************
127BOOL WIN32API HeapUnlock(HANDLE hHeap)
128{
129 dprintf(("KERNEL32: HeapUnlock - stub (TRUE)\n"));
130 return(TRUE);
131}
132//******************************************************************************
133//******************************************************************************
134BOOL WIN32API HeapLock(HANDLE hHeap)
135{
136 dprintf(("KERNEL32: HeapLock - stub (TRUE)\n"));
137 return(TRUE);
138}
139//******************************************************************************
140// LPPROCESS_HEAP_ENTRY lpEntry
141//******************************************************************************
142BOOL WIN32API HeapWalk(HANDLE hHeap, void *lpEntry)
143{
144 dprintf(("KERNEL32: HeapWalk - stub (TRUE)\n"));
145 return(TRUE);
146}
147//******************************************************************************
148//******************************************************************************
149HANDLE WIN32API GetProcessHeap(VOID)
150{
151 HANDLE hHeap;
152
153 dprintf(("KERNEL32: OS2GetProcessHeap\n"));
154 //SvL: Only one process heap per process
155 if(processheap == NULL) {
156 //TODO: I haven't thought real hard about this. I added it just to make "hdr.exe" happy.
157 hHeap = O32_HeapCreate(HEAP_GENERATE_EXCEPTIONS, 1, 0x4000);
158
159 ODIN_FS_BEGIN
160 OS2ProcessHeap = new OS2Heap(hHeap, HEAP_GENERATE_EXCEPTIONS, 0x4000, 0);
161 ODIN_FS_END
162
163 if(OS2ProcessHeap == NULL) {
164 O32_HeapDestroy(hHeap);
165 return(NULL);
166 }
167 processheap = hHeap;
168 }
169 return(processheap);
170}
171//******************************************************************************
172//******************************************************************************
173HLOCAL WIN32API LocalAlloc(UINT fuFlags, DWORD cbBytes)
174{
175 HLOCAL lmem;
176 DWORD dwFlags = 0;
177
178 if(processheap == NULL) {
179 if(GetProcessHeap() == NULL)
180 return(NULL);
181 }
182 if(fuFlags & LMEM_ZEROINIT)
183 dwFlags = HEAP_ZERO_MEMORY;
184
185 lmem = (HLOCAL)OS2ProcessHeap->Alloc(dwFlags, cbBytes, fuFlags);
186
187 dprintf(("KERNEL32: LocalAlloc flags %X, size %d returned %X\n", dwFlags, cbBytes, lmem));
188
189 return(lmem);
190}
191//******************************************************************************
192//******************************************************************************
193HLOCAL WIN32API LocalDiscard(HLOCAL hMem)
194{
195 dprintf(("KERNEL32: LocalDiscard\n"));
196
197// return O32_LocalDiscard(arg1);
198 return(hMem); //TODO: Possible memory leak
199}
200//******************************************************************************
201//******************************************************************************
202UINT WIN32API LocalFlags(HLOCAL hMem)
203{
204 dprintf(("KERNEL32: LocalFlags %X\n", hMem));
205
206 return OS2ProcessHeap->GetFlags((LPVOID)hMem);
207}
208//******************************************************************************
209//******************************************************************************
210HLOCAL WIN32API LocalFree(HLOCAL hMem)
211{
212 dprintf(("KERNEL32: LocalFree %X\n", hMem));
213
214 if(OS2ProcessHeap->GetLockCnt((LPVOID)hMem) != 0) {
215 dprintf(("LocalFree, lock count != 0\n"));
216 return(hMem); //TODO: SetLastError
217 }
218 if(OS2ProcessHeap->Free(0, (LPVOID)hMem) == FALSE) {
219 return(hMem); //TODO: SetLastError
220 }
221 return NULL; //success
222}
223//******************************************************************************
224//******************************************************************************
225HLOCAL WIN32API LocalHandle(PCVOID lpMem)
226{
227 dprintf(("KERNEL32: LocalHandle\n"));
228
229 return (HLOCAL)lpMem;
230}
231//******************************************************************************
232//******************************************************************************
233BOOL WIN32API LocalUnlock(HLOCAL hMem)
234{
235 dprintf(("KERNEL32: LocalUnlock %X\n", hMem));
236
237 return OS2ProcessHeap->Unlock((LPVOID)hMem);
238}
239//******************************************************************************
240//TODO: cbBytes==0 && fuFlags & LMEM_MOVEABLE not handled!!
241//******************************************************************************
242HLOCAL WIN32API LocalReAlloc(HLOCAL hMem, DWORD cbBytes, UINT fuFlags)
243{
244 HLOCAL hLocalNew;
245 LPVOID lpMem;
246
247 dprintf(("KERNEL32: LocalReAlloc %X %d %X\n", hMem, cbBytes, fuFlags));
248
249 //SvL: 8-8-'98: Notepad bugfix (assumes address is identical when new size < old size)
250 if(OS2ProcessHeap->Size(0, (LPVOID)hMem) > cbBytes)
251 return hMem;
252
253 hLocalNew = LocalAlloc(fuFlags, cbBytes);
254 if (hLocalNew != 0)
255 {
256 lpMem = LocalLock(hLocalNew);
257
258 if (lpMem != NULL) /* copy memory if successful */
259 memcpy(lpMem,
260 (LPVOID)hMem,
261 min(cbBytes, OS2ProcessHeap->Size(0, (LPVOID)hMem))
262 );
263
264 LocalUnlock(hLocalNew);
265 OS2ProcessHeap->Free(0, (LPVOID)hMem);
266 }
267 return(hLocalNew);
268}
269//******************************************************************************
270//******************************************************************************
271UINT WIN32API LocalSize(HLOCAL hMem)
272{
273 dprintf(("KERNEL32: LocalSize %X\n", hMem));
274
275 return OS2ProcessHeap->Size(0, (PVOID)hMem);
276}
277//******************************************************************************
278//******************************************************************************
279PVOID WIN32API LocalLock(HLOCAL hMem)
280{
281 dprintf(("KERNEL32: LocalLock %X\n", hMem));
282
283 OS2ProcessHeap->Lock((LPVOID)hMem);
284 return (PVOID)hMem;
285}
286//******************************************************************************
287
288//******************************************************************************
289//* this function is here for completeness, some stupid software requires it.
290UINT WIN32API LocalShrink(HLOCAL hMem,
291 UINT cbNewSize)
292{
293 dprintf(("KERNEL32: LocalShrink %X, %08xh - stub (cbNewSize)\n",
294 hMem,
295 cbNewSize));
296
297 return cbNewSize;
298}
299//******************************************************************************
300
301//******************************************************************************
302//* this function is here for completeness, mIRC/32 requires it.
303UINT WIN32API LocalCompact(UINT cbNewSize)
304{
305 dprintf(("KERNEL32: LocalCompact %08xh - stub (cbNewSize)\n",
306 cbNewSize));
307
308 return cbNewSize;
309}
310//******************************************************************************
311//******************************************************************************
312HGLOBAL WIN32API GlobalAlloc(UINT fuFlags, DWORD dwBytes)
313{
314 dprintf(("KERNEL32: GlobalAlloc %d\n", dwBytes));
315
316 return O32_GlobalAlloc(fuFlags, dwBytes);
317}
318//******************************************************************************
319//******************************************************************************
320HGLOBAL WIN32API GlobalFree( HGLOBAL arg1)
321{
322 dprintf(("KERNEL32: GlobalFree\n"));
323
324 return O32_GlobalFree(arg1);
325}
326//******************************************************************************
327//******************************************************************************
328HGLOBAL WIN32API GlobalHandle( LPCVOID arg1)
329{
330 dprintf(("KERNEL32: OS2GlobalHandle\n"));
331
332 return O32_GlobalHandle((LPVOID)arg1);
333}
334//******************************************************************************
335//******************************************************************************
336UINT WIN32API GlobalFlags(HGLOBAL arg1)
337{
338 dprintf(("KERNEL32: OS2GlobalFlags\n"));
339
340 return O32_GlobalFlags(arg1);
341}
342//******************************************************************************
343//******************************************************************************
344DWORD WIN32API GlobalCompact(DWORD dwMinFree)
345{
346 dprintf(("KERNEL32: GlobalCompact, OBSOLETE - stub\n"));
347
348 return(0);
349}
350//******************************************************************************
351//******************************************************************************
352PVOID WIN32API GlobalLock(HGLOBAL arg1)
353{
354 dprintf(("KERNEL32: GlobalLock\n"));
355
356 return O32_GlobalLock(arg1);
357}
358//******************************************************************************
359//******************************************************************************
360HGLOBAL WIN32API GlobalReAlloc(HGLOBAL arg1, DWORD arg2, UINT arg3)
361{
362 dprintf(("KERNEL32: GlobalReAlloc\n"));
363
364 return O32_GlobalReAlloc(arg1, arg2, arg3);
365}
366//******************************************************************************
367//******************************************************************************
368DWORD WIN32API GlobalSize(HGLOBAL arg1)
369{
370 dprintf(("KERNEL32: GlobalSize\n"));
371
372 return O32_GlobalSize(arg1);
373}
374//******************************************************************************
375//******************************************************************************
376BOOL WIN32API GlobalUnlock(HGLOBAL arg1)
377{
378 dprintf(("KERNEL32: GlobalUnlock\n"));
379
380 return O32_GlobalUnlock(arg1);
381}
382//******************************************************************************
383//******************************************************************************
Note: See TracBrowser for help on using the repository browser.