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

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

thread fixes + heap wrappers

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