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

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

Fix: Kernel32.HeapSize not exported into the DLL. ILINK accepts "HeapSize" = ... so it doesn't become confused with the reserved linker command heapsize.

File size: 12.6 KB
Line 
1/* $Id: heap.cpp,v 1.4 1999-05-31 23:17:17 phaller Exp $ */
2
3/*
4 *
5 * Project Odin Software License can be found in LICENSE.TXT
6 *
7 */
8/*
9 * Win32 heap API functions for OS/2
10 *
11 * Copyright 1998 Sander van Leeuwen
12 *
13 */
14#include <os2win.h>
15#include <stdlib.h>
16#include <string.h>
17#include <builtin.h>
18#include "misc.h"
19
20#define _WIN32
21#include "os2heap.h"
22
23static HANDLE processheap = NULL;
24OS2Heap *OS2ProcessHeap = NULL;
25
26//******************************************************************************
27//******************************************************************************
28LPVOID WIN32API HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes)
29{
30 OS2Heap *curheap = OS2Heap::find(hHeap);
31
32// dprintf(("HeapAlloc %X bytes", dwBytes));
33 if(curheap == NULL)
34 return(NULL);
35
36 return(curheap->Alloc(dwFlags, dwBytes));
37}
38//******************************************************************************
39//******************************************************************************
40LPVOID WIN32API HeapReAlloc(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem, DWORD dwBytes)
41{
42 OS2Heap *curheap = OS2Heap::find(hHeap);
43
44 if(curheap == NULL)
45 return(NULL);
46
47 return(curheap->ReAlloc(dwFlags, lpMem, dwBytes));
48}
49//******************************************************************************
50//******************************************************************************
51BOOL WIN32API HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
52{
53 OS2Heap *curheap = OS2Heap::find(hHeap);
54
55 if(curheap == NULL)
56 return(FALSE);
57
58 return(curheap->Free(dwFlags, lpMem));
59}
60//******************************************************************************
61//******************************************************************************
62HANDLE WIN32API HeapCreate(DWORD flOptions, DWORD dwInitialSize, DWORD dwMaximumSize)
63{
64 OS2Heap *curheap;
65
66 //Create Open32 heap for it's handle
67 HANDLE hHeap = O32_HeapCreate(flOptions, 0, 4096);
68 if(hHeap == NULL)
69 return(NULL);
70
71 curheap = new OS2Heap(hHeap, flOptions, dwInitialSize, dwMaximumSize);
72 if(curheap == NULL) {
73 O32_HeapDestroy(hHeap);
74 return(NULL);
75 }
76 if(curheap->getHeapHandle() == NULL) {
77 O32_HeapDestroy(hHeap);
78 delete curheap;
79 return(NULL);
80 }
81 return(curheap->getHeapHandle());
82}
83//******************************************************************************
84//******************************************************************************
85BOOL WIN32API HeapDestroy(HANDLE hHeap)
86{
87 OS2Heap *curheap = OS2Heap::find(hHeap);
88
89 if(curheap == NULL)
90 return(FALSE);
91
92 O32_HeapDestroy(curheap->getHeapHandle());
93 delete curheap;
94 return(TRUE);
95}
96//******************************************************************************
97//******************************************************************************
98/* PH: Though "HeapSize" is a reserved word for the linker, ILINK can be
99 tricked by placing the word HEAPSIZE in quotes. It then exports it properly
100 to the target DLL.
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 OS2ProcessHeap = new OS2Heap(hHeap, HEAP_GENERATE_EXCEPTIONS, 0x4000, 0);
159 if(OS2ProcessHeap == NULL) {
160 O32_HeapDestroy(hHeap);
161 return(NULL);
162 }
163 processheap = hHeap;
164 }
165 return(processheap);
166}
167//******************************************************************************
168//******************************************************************************
169HLOCAL WIN32API LocalAlloc(UINT fuFlags, DWORD cbBytes)
170{
171 HLOCAL lmem;
172 DWORD dwFlags = 0;
173
174 if(processheap == NULL) {
175 if(GetProcessHeap() == NULL)
176 return(NULL);
177 }
178 if(fuFlags & LMEM_ZEROINIT)
179 dwFlags = HEAP_ZERO_MEMORY;
180
181 lmem = (HLOCAL)OS2ProcessHeap->Alloc(dwFlags, cbBytes, fuFlags);
182
183 dprintf(("KERNEL32: LocalAlloc flags %X, size %d returned %X\n", dwFlags, cbBytes, lmem));
184
185 return(lmem);
186}
187//******************************************************************************
188//******************************************************************************
189HLOCAL WIN32API LocalDiscard(HLOCAL hMem)
190{
191 dprintf(("KERNEL32: LocalDiscard\n"));
192
193// return O32_LocalDiscard(arg1);
194 return(hMem); //TODO: Possible memory leak
195}
196//******************************************************************************
197//******************************************************************************
198UINT WIN32API LocalFlags(HLOCAL hMem)
199{
200 dprintf(("KERNEL32: LocalFlags %X\n", hMem));
201
202 return OS2ProcessHeap->GetFlags((LPVOID)hMem);
203}
204//******************************************************************************
205//******************************************************************************
206HLOCAL WIN32API LocalFree(HLOCAL hMem)
207{
208 dprintf(("KERNEL32: LocalFree %X\n", hMem));
209
210 if(OS2ProcessHeap->GetLockCnt((LPVOID)hMem) != 0) {
211 dprintf(("LocalFree, lock count != 0\n"));
212 return(hMem); //TODO: SetLastError
213 }
214 if(OS2ProcessHeap->Free(0, (LPVOID)hMem) == FALSE) {
215 return(hMem); //TODO: SetLastError
216 }
217 return NULL; //success
218}
219//******************************************************************************
220//******************************************************************************
221HLOCAL WIN32API LocalHandle(PCVOID lpMem)
222{
223 dprintf(("KERNEL32: LocalHandle\n"));
224
225 return (HLOCAL)lpMem;
226}
227//******************************************************************************
228//******************************************************************************
229BOOL WIN32API LocalUnlock(HLOCAL hMem)
230{
231 dprintf(("KERNEL32: LocalUnlock %X\n", hMem));
232
233 return OS2ProcessHeap->Unlock((LPVOID)hMem);
234}
235//******************************************************************************
236//TODO: cbBytes==0 && fuFlags & LMEM_MOVEABLE not handled!!
237//******************************************************************************
238HLOCAL WIN32API LocalReAlloc(HLOCAL hMem, DWORD cbBytes, UINT fuFlags)
239{
240 LPVOID lpMem;
241
242 dprintf(("KERNEL32: LocalReAlloc %X %d %X\n", hMem, cbBytes, fuFlags));
243 //SvL: 8-8-'98: Notepad bugfix (assumes address is identical when new size < old size)
244 if(OS2ProcessHeap->Size(0, (LPVOID)hMem) > cbBytes)
245 return hMem;
246
247 lpMem = (LPVOID)O32_LocalAlloc(fuFlags, cbBytes);
248 memcpy(lpMem, (LPVOID)hMem, min(cbBytes, OS2ProcessHeap->Size(0, (LPVOID)hMem)));
249 OS2ProcessHeap->Free(0, (LPVOID)hMem);
250 return((HLOCAL)lpMem);
251}
252//******************************************************************************
253//******************************************************************************
254UINT WIN32API LocalSize(HLOCAL hMem)
255{
256 dprintf(("KERNEL32: LocalSize %X\n", hMem));
257
258 return OS2ProcessHeap->Size(0, (PVOID)hMem);
259}
260//******************************************************************************
261//******************************************************************************
262PVOID WIN32API LocalLock(HLOCAL hMem)
263{
264 dprintf(("KERNEL32: LocalLock %X\n", hMem));
265
266 OS2ProcessHeap->Lock((LPVOID)hMem);
267 return (PVOID)hMem;
268}
269//******************************************************************************
270
271//******************************************************************************
272//* this function is here for completeness, some stupid software requires it.
273UINT WIN32API LocalShrink(HLOCAL hMem,
274 UINT cbNewSize)
275{
276 dprintf(("KERNEL32: LocalShrink %X, %08xh - stub (cbNewSize)\n",
277 hMem,
278 cbNewSize));
279
280 return cbNewSize;
281}
282//******************************************************************************
283
284//******************************************************************************
285//* this function is here for completeness, mIRC/32 requires it.
286UINT WIN32API LocalCompact(UINT cbNewSize)
287{
288 dprintf(("KERNEL32: LocalCompact %08xh - stub (cbNewSize)\n",
289 cbNewSize));
290
291 return cbNewSize;
292}
293//******************************************************************************
294//******************************************************************************
295HGLOBAL WIN32API GlobalAlloc(UINT fuFlags, DWORD dwBytes)
296{
297 dprintf(("KERNEL32: GlobalAlloc %d\n", dwBytes));
298
299 return O32_GlobalAlloc(fuFlags, dwBytes);
300}
301//******************************************************************************
302//******************************************************************************
303HGLOBAL WIN32API GlobalFree( HGLOBAL arg1)
304{
305 dprintf(("KERNEL32: GlobalFree\n"));
306
307 return O32_GlobalFree(arg1);
308}
309//******************************************************************************
310//******************************************************************************
311HGLOBAL WIN32API GlobalHandle( LPCVOID arg1)
312{
313 dprintf(("KERNEL32: OS2GlobalHandle\n"));
314
315 return O32_GlobalHandle((LPVOID)arg1);
316}
317//******************************************************************************
318//******************************************************************************
319UINT WIN32API GlobalFlags(HGLOBAL arg1)
320{
321 dprintf(("KERNEL32: OS2GlobalFlags\n"));
322
323 return O32_GlobalFlags(arg1);
324}
325//******************************************************************************
326//******************************************************************************
327DWORD WIN32API GlobalCompact(DWORD dwMinFree)
328{
329 dprintf(("KERNEL32: GlobalCompact, OBSOLETE - stub\n"));
330
331 return(0);
332}
333//******************************************************************************
334//******************************************************************************
335PVOID WIN32API GlobalLock(HGLOBAL arg1)
336{
337 dprintf(("KERNEL32: GlobalLock\n"));
338
339 return O32_GlobalLock(arg1);
340}
341//******************************************************************************
342//******************************************************************************
343HGLOBAL WIN32API GlobalReAlloc(HGLOBAL arg1, DWORD arg2, UINT arg3)
344{
345 dprintf(("KERNEL32: GlobalReAlloc\n"));
346
347 return O32_GlobalReAlloc(arg1, arg2, arg3);
348}
349//******************************************************************************
350//******************************************************************************
351DWORD WIN32API GlobalSize(HGLOBAL arg1)
352{
353 dprintf(("KERNEL32: GlobalSize\n"));
354
355 return O32_GlobalSize(arg1);
356}
357//******************************************************************************
358//******************************************************************************
359BOOL WIN32API GlobalUnlock(HGLOBAL arg1)
360{
361 dprintf(("KERNEL32: GlobalUnlock\n"));
362
363 return O32_GlobalUnlock(arg1);
364}
365//******************************************************************************
366//******************************************************************************
Note: See TracBrowser for help on using the repository browser.