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

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

* empty log message *

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