You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

398 lines
8.8 KiB
C++

2 years ago
/************************************************************************
*
* 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)
2 years ago
#include <winsock2.h>
#include <direct.h>
#include <process.h>
#endif
2 years ago
#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);
}