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

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

Fix: fixes and updates for ODINCRT support

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