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

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

Add: added cvs variable $Id$ to the source files.

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