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

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

Fix: Win3-Style Profile support ported from WINE. Also removes Open32 dependency

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