📄 guialloc.lst
字号:
213 4 U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off];
214 4 memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size);
215 4 aBlock[iNext].Off -=NumBytesBeforeBlock;
216 4 }
217 3 }
218 2 }
219 1 /* Check last block */
220 1 if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size)
221 1 r = i;
222 1 return r;
223 1 }
224
225 static void CheckInit(void) {
226 1 if (!IsInitialized)
227 1 GUI_ALLOC_Init();
228 1 }
229
230 /*
231 ********************************************************************
232 *
233 * Exported routines
234 *
235 ********************************************************************
236 */
237
238 void GUI_ALLOC_Init(void) {
239 1 GUI_DEBUG_LOG("\nGUI_ALLOC_Init...");
C51 COMPILER V8.05a GUIALLOC 04/11/2008 14:18:53 PAGE 5
240 1 GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1;
241 1 GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes = GUI_ALLOC_SIZE;
242 1 GUI_ALLOC.NumUsedBlocks = 0;
243 1 GUI_ALLOC.NumUsedBytes = 0;
244 1 aBlock[0].Size = (1<<GUI_BLOCK_ALIGN); /* occupy minimum for a block */
245 1 aBlock[0].Off = 0;
246 1 aBlock[0].Next = 0;
247 1 IsInitialized =1;
248 1 }
249
250 static GUI_HMEM _Alloc(int size) {
251 1 GUI_HMEM hMemNew, hMemIns;
252 1 CheckInit();
253 1 size = Size2LegalSize(size);
254 1 /* Check if memory is available at all ...*/
255 1 if (size > GUI_ALLOC.NumFreeBytes) {
256 2 GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size);
257 2 return 0;
258 2 }
259 1 /* Locate free handle */
260 1 if ((hMemNew = FindFreeHandle()) == 0)
261 1 return 0;
262 1 /* Locate or Create hole of sufficient size */
263 1 hMemIns = FindHole(size);
264 1 #if GUI_ALLOC_AUTDEFRAG
265 1 if (hMemIns == -1) {
266 2 hMemIns = CreateHole(size);
267 2 }
268 1 #endif
269 1 /* Occupy hole */
270 1 if (hMemIns==-1) {
271 2 GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size);
272 2 return 0;
273 2 }
274 1 {
275 2 int Off = aBlock[hMemIns].Off+aBlock[hMemIns].Size;
276 2 int Next = aBlock[hMemIns].Next;
277 2 aBlock[hMemNew].Size = size;
278 2 aBlock[hMemNew].Off = Off;
279 2 if ((aBlock[hMemNew].Next = Next) >0) {
280 3 aBlock[Next].Prev = hMemNew;
281 3 }
282 2 aBlock[hMemNew].Prev = hMemIns;
283 2 aBlock[hMemIns].Next = hMemNew;
284 2 }
285 1 /* Keep track of number of blocks and av. memory */
286 1 GUI_ALLOC.NumUsedBlocks++;
287 1 GUI_ALLOC.NumFreeBlocks--;
288 1 if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) {
289 2 GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks;
290 2 }
291 1 GUI_ALLOC.NumUsedBytes += size;
292 1 GUI_ALLOC.NumFreeBytes -= size;
293 1 if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) {
294 2 GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes;
295 2 }
296 1 /* In order to be on the safe side, zeroinit ! */
297 1 memset(HMEM2PTR(hMemNew), 0, size);
298 1 return hMemNew;
299 1 }
300
301 GUI_HMEM GUI_ALLOC_Alloc(int size) {
C51 COMPILER V8.05a GUIALLOC 04/11/2008 14:18:53 PAGE 6
302 1 GUI_HMEM hMem;
303 1 /* First make sure that init has been called */
304 1 GUI_LOCK();
305 1 GUI_DEBUG_LOG2("\nGUI_ALLOC_Alloc... requesting %d, %d avail", size, GUI_ALLOC.NumFreeBytes);
306 1 hMem = _Alloc(size);
307 1 GUI_DEBUG_LOG1("\nGUI_ALLOC_Alloc : Handle", hMem);
308 1 GUI_UNLOCK();
309 1 return hMem;
310 1 }
311
312 void GUI_ALLOC_Free(GUI_HMEM hMem) {
313 1 int Size;
314 1 if (hMem == GUI_HMEM_NULL) /* Note: This is not an error, it is permitted */
315 1 return;
316 1 GUI_LOCK();
317 1 GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
318 1 /* Do some error checking ... */
319 1 #if GUI_DEBUG_LEVEL>0
320 1 /* Block not allocated ? */
321 1 if (aBlock[hMem].Size==0) {
322 2 GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem");
323 2 return;
324 2 }
325 1 #endif
326 1 Size = aBlock[hMem].Size;
327 1 #ifdef WIN32
memset(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size);
#endif
330 1 GUI_ALLOC.NumFreeBytes += Size;
331 1 GUI_ALLOC.NumUsedBytes -= Size;
332 1 aBlock[hMem].Size = 0;
333 1 {
334 2 int Next = aBlock[hMem].Next;
335 2 int Prev = aBlock[hMem].Prev;
336 2 aBlock[Prev].Next = Next;
337 2 if (Next)
338 2 aBlock[Next].Prev = Prev;
339 2 }
340 1 GUI_ALLOC.NumFreeBlocks++;
341 1 GUI_ALLOC.NumUsedBlocks--;
342 1 GUI_UNLOCK();
343 1 }
344
345 void* GUI_ALLOC_h2p (GUI_HMEM hMem) {
346 1 #if GUI_DEBUG_LEVEL>0
347 1 if (!hMem) {
348 2 GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
349 2 return 0;
350 2 }
351 1 #endif
352 1 return HMEM2PTR(hMem);
353 1 }
354
355 void GUI_ALLOC_FreePtr(GUI_HMEM *ph) {
356 1 GUI_LOCK();
357 1 GUI_ALLOC_Free(*ph);
358 1 *ph =0;
359 1 GUI_UNLOCK();
360 1 }
361
362 /*
363 ********************************************************************
C51 COMPILER V8.05a GUIALLOC 04/11/2008 14:18:53 PAGE 7
364 *
365 * Exported info routines
366 *
367 ********************************************************************
368 */
369
370 int GUI_GetUsedMem(void) {
371 1 int NumUsedBytes=0;
372 1 int i;
373 1 GUI_LOCK();
374 1 CheckInit();
375 1 for (i=1; i; i = aBlock[i].Next) {
376 2 NumUsedBytes += aBlock[i].Size;
377 2 }
378 1 GUI_UNLOCK();
379 1 return NumUsedBytes;
380 1 }
381
382
383 int GUI_ALLOC_GetNumFreeBytes(void) {
384 1 CheckInit();
385 1 return GUI_ALLOC.NumFreeBytes;
386 1 }
387 /*
388 *************************************************
389 *
390 * GetMaxSize
391 *
392 *************************************************
393
394 Returns the biggest available blocksize
395 (without relocation)
396
397 */
398 int GUI_ALLOC_GetMaxSize(void) {
399 1 int r=0;
400 1 int NumFreeBytes;
401 1 int i, iNext;
402 1 GUI_LOCK();
403 1 CheckInit();
404 1 for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
405 2 NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
406 2 if (NumFreeBytes > r) {
407 3 r = NumFreeBytes;
408 3 }
409 2 }
410 1 /* Check last block */
411 1 NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size));
412 1 if (NumFreeBytes > r) {
413 2 r = NumFreeBytes;
414 2 }
415 1 GUI_UNLOCK();
416 1 return r;
417 1 }
418
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2196 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1801 44
PDATA SIZE = ---- ----
C51 COMPILER V8.05a GUIALLOC 04/11/2008 14:18:53 PAGE 8
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -