⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydefmempool.c

📁 sourceforge历史版本完整下载: http://sourceforge.net/project/showfiles.php?group_id=202044 提供了基于b树索引算法的文件数据数据
💻 C
字号:
/**
 *
 * @file mydefmempool.c 内存池 2007-8-25 2:23
 * @brief 如果要分配的内存块小于8字节,分配8字节,
 * 	其它大小的内存分配需求,对齐到8字节,
 * 	超出128字节的内存分配需求采用malloc分配
 * @author lin shao chuan 
 *
 */
#include "mydefmempool.h"

#include <assert.h>
#include <string.h>
#include <stdio.h>

#include "mymutex.h"


static const unsigned int log_2_table[] =
{
	8,   8,   8,   8,   8,   8,   8,   8,
	16,  16,  16,  16,  16,  16,  16,  16,
	24,  24,  24,  24,  24,  24,  24,  24,
	32,  32,  32,  32,  32,  32,  32,  32,
	40,  40,  40,  40,  40,  40,  40,  40,
	48,  48,  48,  48,  48,  48,  48,  48,
	56,  56,  56,  56,  56,  56,  56,  56,
	64,  64,  64,  64,  64,  64,  64,  64,
	72,  72,  72,  72, 	72,  72,  72,  72,
	80,  80,  80,  80,  80,  80,  80,  80,	
	88,  88,  88,  88,  88,  88,  88,  88,	
	96,  96,  96,  96,  96,  96,  96,  96,	
	104, 104, 104, 104, 104, 104, 104, 104,	
	112, 112, 112, 112, 112, 112, 112, 112,	
	120, 120, 120, 120, 120, 120, 120, 120,	
	128, 128, 128, 128, 128, 128, 128, 128,
	128,
};
#define MAX_BLK_SIZE ((sizeof(log_2_table)/sizeof(log_2_table[0])) - 1)

typedef struct __rhapsody_block_t_
{
	size_t blk_size;
	struct __rhapsody_block_t_ * next;
}rhapsody_block;

typedef struct __rhapsody_mempool_t_
{
	/*
	* 内存池保护锁
	*/
	HMYMUTEX protecter;
	
	/*
	* 空闲内存块记录表
	*/
	rhapsody_block * blk[(MAX_BLK_SIZE/8) + 1];	
}rhapsody_mempool;


/**
 * @brief 创建内存池
 */
static rhapsody_mempool * create_mempool()
{
	/* 分配内存管理信息空间,初始化保护锁 */
	rhapsody_mempool * mp = (rhapsody_mempool *)MyMemPoolMalloc(NULL, sizeof(*mp));
	
	mp->protecter = MyMutexConstruct(NULL);
	
	memset(mp->blk, 0, sizeof(mp->blk));
	
	return mp;
}

#define RH_MEMPOOL(x) ((rhapsody_mempool *)x)

/**
 * @brief 分配内存的回调函数
 */
static void * rhapsody_malloc(size_t size, void * context_data)
{
	size_t index = 0;
	rhapsody_block * ptr = NULL;
	
	assert(context_data);
	
	/* 如果超过128,不查表,直接malloc */
	if(size > MAX_BLK_SIZE)
	{
		ptr = (rhapsody_block *)malloc(sizeof(*ptr) + size);
		ptr->blk_size = size;
		ptr->next = NULL;

		return ((char *)ptr) + sizeof(*ptr);
	}

	/* 根据内存分配需求查表,得出应分配的内存块大小 */
	index = log_2_table[size]/8;

	assert(log_2_table[size] >= size);

	/* 加锁 */
	MyMutexLock(RH_MEMPOOL(context_data)->protecter);

	assert(index <= sizeof(RH_MEMPOOL(context_data)->blk) / sizeof(RH_MEMPOOL(context_data)->blk[0]));
	
	/* 根据应分配内存块大小去相应的空闲内存记录表里取内存 */
	ptr = RH_MEMPOOL(context_data)->blk[index];
	if(ptr)
	{
		RH_MEMPOOL(context_data)->blk[index] = ptr->next;

		assert(log_2_table[size] == ptr->blk_size);
	}
	else
	{
		/* 找不到, 则分配内存 */
		ptr = (rhapsody_block *)malloc(sizeof(*ptr) + log_2_table[size]);
		ptr->blk_size = log_2_table[size];
		ptr->next = NULL;	
	}

	/* 解锁 */
	MyMutexUnLock(RH_MEMPOOL(context_data)->protecter);
	
	return ((char *)ptr) + sizeof(*ptr);
}

/**
 * @brief 释放内存的回调函数
 */
static void rhapsody_free(void * ptr, void * context_data)
{
	size_t index = 0;	

	/* 计算对象偏移,得出内存块的信息 */
	rhapsody_block * ptr_blk = (rhapsody_block *)(((char *)ptr) - sizeof(*ptr_blk));

	assert(context_data);

	/* 加锁 */	
	MyMutexLock(RH_MEMPOOL(context_data)->protecter);

	/* 超过128的内存直接free */
	if(ptr_blk->blk_size > MAX_BLK_SIZE)
	{
		free(ptr_blk);
		goto rhapsody_free_end_;
	}

	assert(ptr_blk->blk_size == log_2_table[ptr_blk->blk_size - 1]);

	/* 加入空闲链表 */
	index = log_2_table[ptr_blk->blk_size - 1]/8;
	
	assert(index <= sizeof(RH_MEMPOOL(context_data)->blk) / sizeof(RH_MEMPOOL(context_data)->blk[0]));

	ptr_blk->next = RH_MEMPOOL(context_data)->blk[index];
	
	RH_MEMPOOL(context_data)->blk[index] = ptr_blk;
		
rhapsody_free_end_:

	/* 解锁 */
	MyMutexUnLock(RH_MEMPOOL(context_data)->protecter);
}

/**
 * @brief 释放内存的回调函数
 */
static void rhapsody_destroy(void * context_data)
{
	int i = 0;
	int blk_count = 0;
	rhapsody_mempool * mp = (rhapsody_mempool *)context_data;
	if(NULL == mp)
		return;

	/* 加锁 */	
	MyMutexLock(RH_MEMPOOL(context_data)->protecter);
	
	for(i = 0; i < sizeof(mp->blk)/sizeof(mp->blk[0]); i ++)
	{
		rhapsody_block * blk = mp->blk[i];
		while(blk)
		{
			rhapsody_block * temp = blk;
			blk_count ++;
			blk = blk->next;
			free(temp);
		}
	}	
	
	/* 解锁 */
	MyMutexUnLock(RH_MEMPOOL(context_data)->protecter);
	
	MyMutexDestruct(RH_MEMPOOL(context_data)->protecter);
	
	MyMemPoolFree(NULL, context_data);

	#ifdef _MBCSV6
		printf("[%s:%d]rhapsody_destroy %x %d blk has been free\r\n", __FILE__, __LINE__, context_data, blk_count);
	#else
	#ifdef WIN32
		printf("[%s:%d]rhapsody_destroy %d blk has been free from pool %x \r\n", __FILE__, __LINE__, blk_count, (long long)context_data);
	#else
		printf("[%s:%d]rhapsody_destroy %x %d blk has been free\r\n", __FILE__, __LINE__, context_data, blk_count);
	#endif
	#endif
}

/**
 * @brief 释放内存的回调函数
 */
static void rhapsody_view(void * context_data, void * info, size_t info_size)
{
	int i = 0;
	int blk_count = 0;

	rhapsody_mempool * mp = (rhapsody_mempool *)context_data;
	if(NULL == mp)
		return;

	/* 加锁 */	
	MyMutexLock(RH_MEMPOOL(context_data)->protecter);

	for(i = 0; i < sizeof(mp->blk)/sizeof(mp->blk[0]); i ++)
	{
		rhapsody_block * blk = mp->blk[i];

		#ifdef _MBCSV6		
			printf("[%s:%d]blk : %x\r\n", __FILE__, __LINE__, blk);
		#else
		#ifdef WIN32
			printf("[%s:%d]blk : %x\r\n", __FILE__, __LINE__, (long long)blk);
		#else
			printf("[%s:%d]blk : %x\r\n", __FILE__, __LINE__, blk);
		#endif
		#endif

		while(blk)
		{
			blk_count ++;
			blk = blk->next;
		}
	}

	/* 解锁 */
	MyMutexUnLock(RH_MEMPOOL(context_data)->protecter);
	
	printf("[%s:%d]rhapsody mem pool has blk : %d\r\n\r\n", __FILE__, __LINE__, blk_count);
	
	if(info && info_size == sizeof(rhapsody_info_t))
		((rhapsody_info_t *)info)->blk_count = blk_count;
}

/**
 * @brief 创建一个内存池
 */
HMYMEMPOOL RhapsodyMemPoolConstruct()
{
	rhapsody_mempool * rmp = create_mempool();

	return MyMemPoolConstruct(rhapsody_malloc, rhapsody_free, rhapsody_destroy, rhapsody_view, rmp);
}












⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -