Release 951105
[wine/multimedia.git] / toolkit / heap.c
blob75faefccba9df90be4ffa92bae7f34a284d3c733
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 #ifdef DEBUG_HEAP
215 static void* LastTwenty[20]={ 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0 };
217 void CheckMem(void* f)
219 int i;
221 for(i=0; i<20; i++)
223 if(LastTwenty[i]==f)
224 LastTwenty[i]=NULL;
225 else if(LastTwenty[i])
226 if( *((int*)LastTwenty[i]) != 0x12345678 ||
227 *(((int*)LastTwenty[i])+1) != 0x0fedcba9 )
228 fprintf(stderr,"memory corrupted at %p\n",LastTwenty[i]);
230 fflush(stderr);
233 void NewMem(void* n)
235 int i;
236 for(i=0; i<20; i++)
237 if(!LastTwenty[i])
239 LastTwenty[i]=n;
240 return;
242 for(i=0; i<20; i++)
243 LastTwenty[i]=LastTwenty[i+1];
244 LastTwenty[4]=n;
246 #endif
248 HANDLE LocalAlloc (WORD flags, WORD bytes)
250 HANDLE m;
251 #ifdef DEBUG_HEAP
252 bytes+=2*sizeof(int);
253 #endif
255 if (flags & LMEM_WINE_ALIGN)
256 m = memalign (4, bytes);
257 else
258 m = malloc (bytes);
259 if (m){
260 if (flags & LMEM_ZEROINIT)
261 bzero (m, bytes);
263 #ifdef DEBUG_HEAP
264 CheckMem(NULL);
265 *((int*) m)=0x12345678;
266 *(((int*) m)+1)=0x0fedcba9;
267 fprintf(stderr,"%p malloc'd\n",m); fflush(stderr);
268 NewMem(m);
269 return (HANDLE) (((int*)m)+2);
270 #endif
271 return m;
274 WORD LocalCompact (WORD min_free)
276 return min_free;
279 WORD LocalFlags (HANDLE hMem)
281 return 0;
284 HANDLE LocalFree (HANDLE hMem)
286 #ifdef DEBUG_HEAP
287 hMem=(HANDLE) (((int*)hMem)-2);
288 CheckMem(hMem);
289 fprintf(stderr,"%p free-ing...",hMem);
290 if( *((int*)hMem) != 0x12345678 ||
291 *(((int*)hMem)+1) != 0x0fedcba9 )
292 fprintf(stderr,"memory corrupted...");
293 else
295 *((int*)hMem) = 0x9abcdef0;
296 *(((int*)hMem)+1) = 0x87654321;
298 fflush(stderr);
299 #endif
300 free(hMem);
301 #ifdef DEBUG_HEAP
302 fprintf(stderr,"free'd\n"); fflush(stderr);
303 #endif
304 return 0;
307 BOOL LocalInit (HANDLE segment, WORD start, WORD end)
309 return TRUE;
312 LPVOID LocalLock (HANDLE hMem)
314 return hMem;
317 HANDLE LocalReAlloc (HANDLE hMem, WORD flags, WORD bytes)
319 #ifdef DEBUG_HEAP
320 LocalFree(hMem);
321 return LocalAlloc(flags,bytes);
322 #endif
323 return realloc(hMem, bytes);
326 WORD LocalSize (HANDLE hMem)
328 /* Not implemented yet */
329 return 0;
333 BOOL LocalUnlock (HANDLE hMem)
335 return 0;
338 HANDLE GlobalAlloc (WORD flags, DWORD size)
340 return LocalAlloc (flags, size);
343 HANDLE GlobalFree (HANDLE hMem)
345 return LocalFree (hMem);
348 LPVOID GlobalLock (HGLOBAL hMem)
350 return LocalLock (hMem);
353 BOOL GlobalUnlock (HANDLE hMem)
355 return LocalUnlock (hMem);
358 WORD GlobalFlags (HANDLE hMem)
360 return LocalFlags (hMem);
363 DWORD GlobalSize (HANDLE hMem)
365 return LocalSize (hMem);
368 DWORD GlobalCompact(DWORD desired)
370 if (desired)
371 return desired;
372 else
373 return 0x01000000; /* Should check the available core. */
376 HANDLE GlobalReAlloc(HANDLE hMem, DWORD new_size, WORD flags)
378 if (!(flags & GMEM_MODIFY))
379 return LocalReAlloc (hMem, new_size, flags);
380 else
381 return hMem;
384 #endif