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

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

Code cleanup #1 for build, mainly addresses linkage problems

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