Release 951124
[wine/multimedia.git] / toolkit / heap.c
blob40e52cbb61d8fe119870cda9c8b0da448aa91e42
1 /*
2 * Memory alllocation for the Wine Library toolkit
4 * Copyright (C) 1994 Miguel de Icaza
6 * All the memory management is being done by the libc malloc and friends.
7 */
9 /* #ifndef __STDC__ */
10 #include <malloc.h>
11 #include <stdio.h>
12 #include <string.h>
13 /* #endif */
14 #include "windows.h"
15 #include "xmalloc.h"
17 #ifdef WINELIB16
19 /* Controls the blocks per handle table */
20 #define MAXBLOCKS 1024
22 static char Copyright [] = "Copyright (C) 1994 Miguel de Icaza";
24 typedef struct handle_table {
25 struct handle_table *next;
26 void *blocks [MAXBLOCKS];
27 } handle_table_t;
29 static handle_table_t handle_table;
31 static void **HEAP_GetFreeSlot (HANDLE *hNum)
33 handle_table_t *table, *last;
34 int i, j;
36 for (table = &handle_table, j = 0; table; table = table->next, j++){
37 for (i = 0; i < MAXBLOCKS; i++)
38 if (!table->blocks [i])
39 goto AssignBlock;
40 last = table;
43 /* No free slots */
44 last->next = xmalloc (sizeof (handle_table_t));
45 table = last->next;
46 memset (table, 0, sizeof (handle_table_t));
47 i = 0;
49 AssignBlock:
50 *hNum = j*MAXBLOCKS+i;
51 return &table->blocks [i];
54 static void HEAP_Handle_is_Zero ()
56 printf ("Warning: Handle is Zero, segmentation fault comming\n");
59 static void **HEAP_FindSlot (HANDLE hNum)
61 handle_table_t *table = &handle_table;
62 int i, j;
64 if (!hNum)
65 HEAP_Handle_is_Zero ();
67 hNum--;
68 for (j = hNum; j > MAXBLOCKS; j -= MAXBLOCKS){
69 table = table->next;
70 if (!table) return 0;
72 return &table->blocks [hNum%MAXBLOCKS];
75 HANDLE LocalAlloc (WORD flags, WORD bytes)
77 void *m;
78 void **slot;
79 HANDLE hMem;
81 slot = HEAP_GetFreeSlot (&hMem);
82 if (flags & LMEM_WINE_ALIGN)
83 m = memalign (4, bytes);
84 else
85 m = malloc (bytes);
86 if (m){
87 *slot = m;
88 if (flags & LMEM_ZEROINIT)
89 bzero (m, bytes);
91 #ifdef DEBUG_HEAP
92 printf ("Handle %d [%d] = %p\n", hMem+1, bytes, m);
93 #endif
94 return hMem+1;
96 return 0;
99 WORD LocalCompact (WORD min_free)
101 return min_free;
104 WORD LocalFlags (HANDLE hMem)
106 return 0;
109 HANDLE LocalFree (HANDLE hMem)
111 void **m = HEAP_FindSlot (hMem);
113 free (*m);
114 *m = 0;
115 return 0;
118 BOOL LocalInit (WORD segment, WORD start, WORD end)
120 return 1;
123 WORD LocalLock (HANDLE hMem)
125 void **m = HEAP_FindSlot (hMem);
126 #ifdef DEBUG_HEAP
127 printf (">%d->%p\n", hMem, *m);
128 #endif
129 return m ? *m : 0;
132 HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
134 void **m = HEAP_FindSlot (hMem);
136 xrealloc (*m, bytes);
139 WORD LocalSize (HANDLE hMem)
141 /* Not implemented yet */
145 BOOL LocalUnlock (HANDLE hMem)
147 return 0;
150 HANDLE GlobalAlloc (WORD flags, DWORD size)
152 return LocalAlloc (flags, size);
155 HANDLE GlobalFree (HANDLE hMem)
157 return LocalFree (hMem);
160 char *GlobalLock (HANDLE hMem)
162 return LocalLock (hMem);
165 BOOL GlobalUnlock (HANDLE hMem)
167 return LocalUnlock (hMem);
170 WORD GlobalFlags (HANDLE hMem)
172 return LocalFlags (hMem);
175 DWORD GlobalSize (HANDLE hMem)
177 return LocalSize (hMem);
180 DWORD GlobalCompact(DWORD desired)
182 if (desired)
183 return desired;
184 else
185 return 0x01000000; /* Should check the available core. */
188 HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
190 if (!(flags & GMEM_MODIFY))
191 return LocalReAlloc (hMem, new_size, flags);
194 int HEAP_LocalSize ()
196 return 0;
199 int HEAP_LocalFindHeap ()
201 return 0;
204 #ifdef UNIMPLEMENTED
206 DWORD int GlobalHandle(WORD selector)
210 #endif
212 #else /* WINELIB16 */
214 typedef struct { DWORD Size; DWORD Padding[3]; } HeapData;
216 HANDLE HEAP_Alloc (WORD flags, DWORD bytes)
218 HeapData* m;
220 bytes+=sizeof(HeapData);
221 if (flags & LMEM_WINE_ALIGN)
222 m = memalign (4, bytes);
223 else
224 m = malloc (bytes);
225 if (m){
226 if (flags & LMEM_ZEROINIT)
227 bzero (m, bytes);
229 m->Size=bytes-sizeof(HeapData);
230 return m+1;
233 HANDLE HEAP_Free (HANDLE hMem)
235 HeapData* m=(HeapData*)hMem;
236 free(m-1);
237 return 0;
240 DWORD HEAP_Size (HANDLE hMem)
242 HeapData* m=(HeapData*)hMem;
243 return (m-1)->Size;
246 HANDLE HEAP_ReAlloc(HANDLE hMem,DWORD bytes,UINT flags)
248 HeapData* m=(HeapData*)hMem;
249 if(!bytes)
251 free(m-1);
252 return 0; /* Inaccurate behavior, but should suffice */
254 m=realloc (m-1, bytes+sizeof(HeapData));
255 if(flags & LMEM_ZEROINIT && bytes > m->Size)
256 bzero ((char*)m+sizeof(HeapData)+m->Size, bytes-m->Size);
257 m->Size=bytes;
258 return m+1;
261 HANDLE LocalAlloc (WORD flags, WORD bytes)
263 return HEAP_Alloc(flags,bytes);
266 UINT LocalFlags (HANDLE hMem)
268 return 0;
271 HANDLE LocalFree (HANDLE hMem)
273 return HEAP_Free(hMem);
276 BOOL LocalInit (HANDLE segment, WORD start, WORD end)
278 return TRUE;
281 LPVOID LocalLock (HANDLE hMem)
283 return hMem;
286 HANDLE LocalReAlloc (HANDLE hMem, WORD new_size, WORD flags)
288 if (!(flags & LMEM_MODIFY))
289 return HEAP_ReAlloc (hMem, new_size, flags);
290 else
291 return hMem;
294 UINT LocalSize (HANDLE hMem)
296 return HEAP_Size(hMem);
300 BOOL LocalUnlock (HANDLE hMem)
302 return 0;
305 HANDLE GlobalAlloc (WORD flags, DWORD size)
307 return HEAP_Alloc (flags,size);
310 HANDLE GlobalFree (HANDLE hMem)
312 return HEAP_Free (hMem);
315 LPVOID GlobalLock (HGLOBAL hMem)
317 return hMem;
320 BOOL GlobalUnlock (HANDLE hMem)
322 return 0;
325 WORD GlobalFlags (HANDLE hMem)
327 return LocalFlags (hMem);
330 DWORD GlobalSize (HANDLE hMem)
332 return HEAP_Size (hMem);
335 HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
337 if (!(flags & GMEM_MODIFY))
338 return HEAP_ReAlloc (hMem, new_size, flags);
339 else
340 return hMem;
343 #endif