|
|
|
|
/************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2003-2004
|
|
|
|
|
* Shenzhen SCADA Control Technology Co., Ltd.
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>й©<EFBFBD>Ķ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>亯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 2005/04/12
|
|
|
|
|
*
|
|
|
|
|
***********************************************************************/
|
|
|
|
|
/*#ifdef OS_LINUX
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
#endif*/
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <memory.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <errno.h>
|
|
|
|
|
|
|
|
|
|
#include "time.h"
|
|
|
|
|
#include "list_entry.h"
|
|
|
|
|
#include "os_heap.h"
|
|
|
|
|
|
|
|
|
|
#if defined(_WIN32)
|
|
|
|
|
#include <winsock2.h>
|
|
|
|
|
#include <direct.h>
|
|
|
|
|
#include <process.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef _fclose
|
|
|
|
|
#undef _fclose
|
|
|
|
|
#endif
|
|
|
|
|
#define _fclose(_fp) do {if (_fp) {while (EOF == fclose((_fp)) && EINTR == errno);}} while(0)
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
typedef enum {
|
|
|
|
|
eMalloc = 0, /* ʹ<><CAB9>malloc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> */
|
|
|
|
|
eCalloc = 1 /* ʹ<><CAB9>calloc<6F><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD> */
|
|
|
|
|
} heap_type_t;
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>鸽<EFBFBD><EFBFBD>ͷ
|
|
|
|
|
*
|
|
|
|
|
* \note
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>뱣֤<EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD>ijߴ类16<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
typedef struct tag_heap_head_t {
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD>ڴ<EFBFBD><DAB4>鸽<EFBFBD><E9B8BD>ͷ<EFBFBD><CDB7><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռλ */
|
|
|
|
|
list_entry_t anchor;
|
|
|
|
|
|
|
|
|
|
/*! <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
|
|
|
|
|
struct timeval tv;
|
|
|
|
|
|
|
|
|
|
/*! <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
heap_type_t type;
|
|
|
|
|
|
|
|
|
|
/*! <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD> */
|
|
|
|
|
char * fl;
|
|
|
|
|
|
|
|
|
|
/*! <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䷢<EFBFBD><E4B7A2><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
int line;
|
|
|
|
|
|
|
|
|
|
/*! <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ijߴ<C4B3>(<28>ֽ<EFBFBD>) */
|
|
|
|
|
size_t size;
|
|
|
|
|
|
|
|
|
|
} heap_list_t;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
#define os_heap_alignment 16
|
|
|
|
|
#define os_heap_pad ((sizeof(heap_list_t) % os_heap_alignment) ? (os_heap_alignment - (sizeof(heap_list_t) % os_heap_alignment)) : 0)
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>os_heap<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ */
|
|
|
|
|
#define os_heap_start_addr(_data) ((void *)(((unsigned char *)(_data)) - sizeof(heap_list_t) - os_heap_pad))
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>os_heap<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ */
|
|
|
|
|
#define os_heap_data_addr(_start) ((void *)(((unsigned char *)(_start)) + sizeof(heap_list_t) + os_heap_pad))
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF>ijߴ<C4B3><DFB4><EFBFBD>os_heap<61><70><EFBFBD>ijߴ<C4B3> */
|
|
|
|
|
#define os_heap_mb_size(_size) (sizeof(heap_list_t) + os_heap_pad + (_size))
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>飺
|
|
|
|
|
*
|
|
|
|
|
* 1. <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>˽<EFBFBD><EFBFBD><EFBFBD>̣߳<EFBFBD>ר<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD>źţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD>档
|
|
|
|
|
* 3. <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>βָ<EFBFBD>롣
|
|
|
|
|
* 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʩ<EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD>ʼ<EFBFBD><CABC> */
|
|
|
|
|
static int g_heap_initialized = 0;
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ */
|
|
|
|
|
static list_entry_t g_heap_head;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>heap_malloc/heap_calloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
static size_t g_heap_item_counter = 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>heap_malloc/heap_calloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ֽ<EFBFBD>)
|
|
|
|
|
*/
|
|
|
|
|
static size_t g_heap_byte_counter = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʩ */
|
|
|
|
|
static void heap_intialize();
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \param size ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>ijߴ<EFBFBD>
|
|
|
|
|
* \param file ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD>null<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>(anony)
|
|
|
|
|
* \param line <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \retutrn
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>롣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \note
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ治<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>heap_free<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ档
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD>μ<EFBFBD> ANSI C <EFBFBD><EFBFBD><EFBFBD><EFBFBD> malloc<EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void * heap_malloc (
|
|
|
|
|
size_t size,
|
|
|
|
|
const char * file,
|
|
|
|
|
int line )
|
|
|
|
|
{
|
|
|
|
|
// #ifdef DISABLE_OS_HEAP
|
|
|
|
|
return malloc(size);
|
|
|
|
|
/*#else /* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
/*
|
|
|
|
|
struct timeval tv;
|
|
|
|
|
char * fl = NULL;
|
|
|
|
|
void * mb = NULL;
|
|
|
|
|
heap_list_t * hl = NULL;
|
|
|
|
|
|
|
|
|
|
if (0 == size)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (file) {
|
|
|
|
|
fl = (char *)malloc(strlen(file) + 4);
|
|
|
|
|
if (fl) strcpy (fl, file);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gettimeofday(&tv, NULL);
|
|
|
|
|
|
|
|
|
|
mb = malloc(os_heap_mb_size(size));
|
|
|
|
|
if (NULL == mb) {
|
|
|
|
|
if (fl) free (fl);
|
|
|
|
|
return mb;
|
|
|
|
|
} else {
|
|
|
|
|
memset (mb, 0, os_heap_mb_size(size));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hl = (heap_list_t *)mb;
|
|
|
|
|
|
|
|
|
|
hl->type = eMalloc;
|
|
|
|
|
hl->tv = tv;
|
|
|
|
|
hl->fl = fl;
|
|
|
|
|
hl->line = line;
|
|
|
|
|
hl->size = size;
|
|
|
|
|
|
|
|
|
|
if (!g_heap_initialized) {
|
|
|
|
|
heap_intialize();
|
|
|
|
|
g_heap_initialized = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
insert_tail_list (&g_heap_head, &(hl->anchor));
|
|
|
|
|
g_heap_item_counter++;
|
|
|
|
|
g_heap_byte_counter += hl->size;
|
|
|
|
|
|
|
|
|
|
return os_heap_data_addr(hl);
|
|
|
|
|
#endif *//* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD>鱻<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>0.
|
|
|
|
|
*
|
|
|
|
|
* \param num <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* \param elm_size ÿһ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ijߴ<EFBFBD>(<EFBFBD>ֽ<EFBFBD>)
|
|
|
|
|
* \param file ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><EFBFBD><EFBFBD>null<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>(anony)
|
|
|
|
|
* \param line <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \retutrn
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>롣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \note
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ治<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>heap_free<EFBFBD>ͷŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ档
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD>μ<EFBFBD> ANSI C <EFBFBD><EFBFBD><EFBFBD><EFBFBD> calloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> calloc <EFBFBD><EFBFBD>֮ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD>calloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD>صĶ<EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>elm_size<EFBFBD>߽<EFBFBD>
|
|
|
|
|
* <EFBFBD>ϡ<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void * heap_calloc (
|
|
|
|
|
size_t num,
|
|
|
|
|
size_t elm_size,
|
|
|
|
|
const char * file,
|
|
|
|
|
int line )
|
|
|
|
|
{
|
|
|
|
|
//#ifdef DISABLE_OS_HEAP
|
|
|
|
|
return calloc(num, elm_size);
|
|
|
|
|
//#else /* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
|
|
|
|
|
/* struct timeval tv;
|
|
|
|
|
char * fl = NULL;
|
|
|
|
|
void * mb = NULL;
|
|
|
|
|
heap_list_t * hl = NULL;
|
|
|
|
|
|
|
|
|
|
if (0 == num * elm_size)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
if (file) {
|
|
|
|
|
fl = (char *)malloc(strlen(file) + 4);
|
|
|
|
|
if (fl) strcpy (fl, file);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gettimeofday(&tv, NULL);
|
|
|
|
|
|
|
|
|
|
mb = malloc(os_heap_mb_size(elm_size * num));
|
|
|
|
|
if (NULL == mb) {
|
|
|
|
|
if (fl) free (fl);
|
|
|
|
|
return mb;
|
|
|
|
|
} else {
|
|
|
|
|
memset (mb, 0, os_heap_mb_size(elm_size * num));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hl = (heap_list_t *)mb;
|
|
|
|
|
|
|
|
|
|
hl->type = eCalloc;
|
|
|
|
|
hl->tv = tv;
|
|
|
|
|
hl->fl = fl;
|
|
|
|
|
hl->line = line;
|
|
|
|
|
hl->size = elm_size * num;
|
|
|
|
|
|
|
|
|
|
if (!g_heap_initialized) {
|
|
|
|
|
heap_intialize();
|
|
|
|
|
g_heap_initialized = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
insert_tail_list (&g_heap_head, &(hl->anchor));
|
|
|
|
|
g_heap_item_counter++;
|
|
|
|
|
g_heap_byte_counter += hl->size;
|
|
|
|
|
|
|
|
|
|
return os_heap_data_addr(hl);
|
|
|
|
|
#endif *//* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief <EFBFBD>ͷŶ<EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \param memblock ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>heap_alloc/heap_calloc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ档
|
|
|
|
|
*
|
|
|
|
|
* \return
|
|
|
|
|
* <EFBFBD>ޡ<EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void heap_free (void * mb)
|
|
|
|
|
{
|
|
|
|
|
#ifdef DISABLE_OS_HEAP
|
|
|
|
|
free (mb);
|
|
|
|
|
#else /* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
size_t sz = 0;
|
|
|
|
|
heap_list_t * hl = NULL;
|
|
|
|
|
|
|
|
|
|
if (NULL == mb)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (!g_heap_initialized) {
|
|
|
|
|
heap_intialize();
|
|
|
|
|
g_heap_initialized = 1;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hl = (heap_list_t *)os_heap_start_addr(mb);
|
|
|
|
|
|
|
|
|
|
#if defined(WIN32) && (defined(DEBUG) || defined(_DEBUG))
|
|
|
|
|
if (IsBadReadPtr((void *)hl, sizeof(heap_list_t))) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (IsBadReadPtr((void *)hl, os_heap_mb_size(hl->size))) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
remove_entry_list (&(hl->anchor));
|
|
|
|
|
sz = hl->size;
|
|
|
|
|
if (hl->fl)
|
|
|
|
|
free ((void *)(hl->fl));
|
|
|
|
|
free ((void *)hl);
|
|
|
|
|
|
|
|
|
|
g_heap_item_counter--;
|
|
|
|
|
g_heap_byte_counter -= sz;
|
|
|
|
|
|
|
|
|
|
#endif /* #ifdef DISABLE_OS_HEAP */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* \brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵķ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>С<EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \param fname <EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䱨<EFBFBD>潫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>fname<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL<EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD>潫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϡ<EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \retval -1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
|
|
|
|
|
* \retval 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>óɹ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*
|
|
|
|
|
* \note
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* ʱ<EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* ......
|
|
|
|
|
* <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>i:
|
|
|
|
|
* ʱ<EFBFBD><EFBFBD>: tv
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: malloc/calloc,
|
|
|
|
|
* Դ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>: fl(line)
|
|
|
|
|
* <EFBFBD>ߴ<EFBFBD>: size
|
|
|
|
|
* ......
|
|
|
|
|
*/
|
|
|
|
|
int heap_report(const char * fname)
|
|
|
|
|
{
|
|
|
|
|
/* #ifndef DISABLE_OS_HEAP
|
|
|
|
|
int i = 0;
|
|
|
|
|
FILE * fp = NULL;
|
|
|
|
|
|
|
|
|
|
heap_list_t * hl = NULL;
|
|
|
|
|
|
|
|
|
|
list_entry_t * item = NULL;
|
|
|
|
|
list_entry_t * first = NULL;
|
|
|
|
|
list_entry_t * next = NULL;
|
|
|
|
|
|
|
|
|
|
char szdt[32];
|
|
|
|
|
|
|
|
|
|
if (fname) {
|
|
|
|
|
fp = fopen (fname, "a+t");
|
|
|
|
|
if (NULL == fp)
|
|
|
|
|
return -1;
|
|
|
|
|
} else
|
|
|
|
|
fp = stdout;
|
|
|
|
|
|
|
|
|
|
if (!g_heap_initialized) {
|
|
|
|
|
heap_intialize();
|
|
|
|
|
g_heap_initialized = 1;
|
|
|
|
|
if (fname) _fclose(fp);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fprintf (fp, "\n"
|
|
|
|
|
"heap allocation summary...\n"
|
|
|
|
|
"time: %s\n"
|
|
|
|
|
"heap_item_counter: %u\n"
|
|
|
|
|
"heap_byte_counter: %u(bytes)\n",
|
|
|
|
|
cur_tm_string (szdt),
|
|
|
|
|
g_heap_item_counter,
|
|
|
|
|
g_heap_byte_counter);
|
|
|
|
|
|
|
|
|
|
first = &g_heap_head;
|
|
|
|
|
for ( next = first->flink; next != first; next = next->flink )
|
|
|
|
|
{
|
|
|
|
|
item = next;
|
|
|
|
|
hl = CONTAINING_RECORD ( item, heap_list_t, anchor );
|
|
|
|
|
|
|
|
|
|
fprintf (fp, " heap block %d:"
|
|
|
|
|
" times: %s"
|
|
|
|
|
" type: %s"
|
|
|
|
|
" size: %08u (bytes)"
|
|
|
|
|
" source: %s [%d]\n",
|
|
|
|
|
i++, timeval_string(&(hl->tv), szdt),
|
|
|
|
|
(eMalloc == hl->type ? "malloc" : "calloc"),
|
|
|
|
|
hl->size, (hl->fl ? hl->fl : "nony"), hl->line);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fname) _fclose(fp);
|
|
|
|
|
#endif*/
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void heap_intialize()
|
|
|
|
|
{
|
|
|
|
|
Initialize_list_head (&g_heap_head);
|
|
|
|
|
}
|