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.
14 /* Controls the blocks per handle table */
15 #define MAXBLOCKS 1024
17 static char Copyright
[] = "Copyright (C) 1994 Miguel de Icaza";
19 typedef struct handle_table
{
20 struct handle_table
*next
;
21 void *blocks
[MAXBLOCKS
];
24 static handle_table_t handle_table
;
26 static void **HEAP_GetFreeSlot (HANDLE
*hNum
)
28 handle_table_t
*table
, *last
;
31 for (table
= &handle_table
, j
= 0; table
; table
= table
->next
, j
++){
32 for (i
= 0; i
< MAXBLOCKS
; i
++)
33 if (!table
->blocks
[i
])
39 last
->next
= malloc (sizeof (handle_table_t
));
41 memset (table
, 0, sizeof (handle_table_t
));
45 *hNum
= j
*MAXBLOCKS
+i
;
46 return &table
->blocks
[i
];
49 static void HEAP_Handle_is_Zero ()
51 printf ("Warning: Handle is Zero, segmentation fault comming\n");
54 static void **HEAP_FindSlot (HANDLE hNum
)
56 handle_table_t
*table
= &handle_table
;
60 HEAP_Handle_is_Zero ();
63 for (j
= hNum
; j
> MAXBLOCKS
; j
-= MAXBLOCKS
){
67 return &table
->blocks
[hNum
%MAXBLOCKS
];
70 HANDLE
LocalAlloc (WORD flags
, WORD bytes
)
76 slot
= HEAP_GetFreeSlot (&hMem
);
77 if (flags
& LMEM_WINE_ALIGN
)
78 m
= memalign (4, bytes
);
83 if (flags
& LMEM_ZEROINIT
)
87 printf ("Handle %d [%d] = %p\n", hMem
+1, bytes
, m
);
94 WORD
LocalCompact (WORD min_free
)
99 WORD
LocalFlags (HANDLE hMem
)
104 HANDLE
LocalFree (HANDLE hMem
)
106 void **m
= HEAP_FindSlot (hMem
);
113 BOOL
LocalInit (WORD segment
, WORD start
, WORD end
)
118 WORD
LocalLock (HANDLE hMem
)
120 void **m
= HEAP_FindSlot (hMem
);
122 printf (">%d->%p\n", hMem
, *m
);
127 HANDLE
LocalReAlloc (HANDLE hMem
, WORD flags
, WORD bytes
)
129 void **m
= HEAP_FindSlot (hMem
);
134 WORD
LocalSize (HANDLE hMem
)
136 /* Not implemented yet */
140 BOOL
LocalUnLock (HANDLE hMem
)
145 HANDLE
GlobalAlloc (WORD flags
, DWORD size
)
147 return LocalAlloc (flags
, size
);
150 HANDLE
GlobalFree (HANDLE hMem
)
152 return LocalFree (hMem
);
155 char *GlobalLock (HANDLE hMem
)
157 return LocalLock (hMem
);
160 BOOL
GlobalUnlock (HANDLE hMem
)
162 return LocalUnLock (hMem
);
165 WORD
GlobalFlags (HANDLE hMem
)
167 return LocalFlags (hMem
);
170 DWORD
GlobalSize (HANDLE hMem
)
172 return LocalSize (hMem
);
175 DWORD
GlobalCompact(DWORD desired
)
180 return 0x01000000; /* Should check the available core. */
183 HANDLE
GlobalReAlloc(HANDLE hMem
, DWORD new_size
, WORD flags
)
185 if (!(flags
& GMEM_MODIFY
))
186 return LocalReAlloc (hMem
, new_size
, flags
);
189 int HEAP_LocalSize ()
194 int HEAP_LocalFindHeap ()
201 DWORD
int GlobalHandle(WORD selector
)