📄 blockheap.c
字号:
/*** $Id: blockheap.c,v 1.7 2003/09/04 03:46:47 weiym Exp $**** blockheap.c: The heap of block data.**** Copyright (C) 2003 Feynman Software.** Copyright (C) 1999, 2000, 2002 Wei Yongming.**** Current maintainer: Wei Yongming.**** Create date: 2001/01/10*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*//*** TODO:*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include "common.h"#include "minigui.h"#include "blockheap.h"void InitBlockDataHeap (PBLOCKHEAP heap, size_t bd_size, size_t heap_size){#ifndef _LITE_VERSION pthread_mutex_init (&heap->lock, NULL);#endif heap->heap = NULL; heap->bd_size = bd_size + sizeof (DWORD); heap->heap_size = heap_size;}void* BlockDataAlloc (PBLOCKHEAP heap){ int i; char* block_data = NULL;#ifndef _LITE_VERSION pthread_mutex_lock (&heap->lock);#endif if (heap->heap == NULL) { if (!(heap->heap = calloc (heap->heap_size, heap->bd_size))) goto ret; heap->free = 0; } block_data = (char*) heap->heap + heap->bd_size*heap->free; for (i = heap->free; i < heap->heap_size; i++) { if (*((DWORD*)block_data) == BDS_FREE) { heap->free = i + 1; *((DWORD*)block_data) = BDS_USED;#if 0 fprintf (stderr, "heap: %p, Allocated: %d, free: %d.\n", heap, i, heap->free); fprintf (stderr, "Heap: (bd_size: %d, heap_size: %d, heap: %p).\n", heap->bd_size, heap->heap_size, heap->heap);#endif goto ret; } block_data += heap->bd_size; } if (!(block_data = calloc (1, heap->bd_size))) goto ret; *((DWORD*)block_data) = BDS_SPECIAL;ret:#ifndef _LITE_VERSION pthread_mutex_unlock (&heap->lock);#endif if (block_data) return block_data + sizeof (DWORD); return NULL;}void BlockDataFree (PBLOCKHEAP heap, void* data){ int i; char* block_data;#ifndef _LITE_VERSION pthread_mutex_lock (&heap->lock);#endif block_data = (char*) data - sizeof (DWORD); if (*((DWORD*)block_data) == BDS_SPECIAL) free (block_data); else if (*((DWORD*)block_data) == BDS_USED) { *((DWORD*)block_data) = BDS_FREE; i = (block_data - (char*)heap->heap)/heap->bd_size; if (heap->free > i) heap->free = i; #if 0 fprintf (stderr, "Heap: %p: Freed: %d, free: %d.\n", heap, i, heap->free); fprintf (stderr, "Heap: (bd_size: %d, heap_size: %d, heap: %p).\n", heap->bd_size, heap->heap_size, heap->heap);#endif }#ifndef _LITE_VERSION pthread_mutex_unlock (&heap->lock);#endif}void DestroyBlockDataHeap (PBLOCKHEAP heap){#if 0 fprintf (stderr, "Heap: (bd_size: %d, heap_size: %d, heap: %p).\n", heap->bd_size, heap->heap_size, heap->heap);#endif#ifndef _LITE_VERSION pthread_mutex_destroy (&heap->lock);#endif free (heap->heap);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -