* include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: modified

the debugging memory manager to report the location (source file name
        + line number) where leaked memory blocks are allocated in the source
        file..  funny, isn't it ??
This commit is contained in:
David Turner 2001-10-22 14:50:41 +00:00
parent 869fc49017
commit 950c669060
4 changed files with 76 additions and 51 deletions

View File

@ -1,5 +1,10 @@
2001-10-22 David Turner <david@freetype.org>
* include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c: modified
the debugging memory manager to report the location (source file name
+ line number) where leaked memory blocks are allocated in the source
file.. funny, isn't it ??
* src/base/ftdbgmem.c: new debugging memory manager. You must define
the FT_DEBUG_MEMORY macro in "ftoption.h" to enable it. It will record
every memory block allocated and report simple errors like memory

View File

@ -5,6 +5,3 @@ Here is a list of items that need to be addressed in FreeType 2; they are
not exactly bugs, but should be considered though:
* Add synthesized Unicode charmap processing to the CFF driver.
* Add the new auto-hinting source code / native Type1/Type2 hinter
to the source code.

View File

@ -55,6 +55,16 @@ FT_BEGIN_HEADER
/*************************************************************************/
/*************************************************************************/
#ifdef FT_DEBUG_MEMORY
FT_BASE( FT_Error )
FT_Alloc_Debug( FT_Memory memory,
FT_Long size,
void* *P,
const char* file_name,
FT_Long line_no );
#endif
/*************************************************************************/
/* */
@ -83,7 +93,6 @@ FT_BEGIN_HEADER
FT_Long size,
void* *P );
/*************************************************************************/
/* */
/* <Function> */
@ -159,6 +168,7 @@ FT_BEGIN_HEADER
#define MEM_Move( dest, source, count ) memmove( dest, source, count )
/*************************************************************************/
/* */
/* We now support closures to produce completely reentrant code. This */
@ -172,12 +182,26 @@ FT_BEGIN_HEADER
/* ALLOC_ARRAY() now use an implicit variable, `memory'. It must be */
/* defined at all locations where a memory operation is queried. */
/* */
#define MEM_Alloc( _pointer_, _size_ ) \
FT_Alloc( memory, _size_, (void**)&(_pointer_) )
#define MEM_Alloc_Array( _pointer_, _count_, _type_ ) \
FT_Alloc( memory, (_count_)*sizeof ( _type_ ), \
(void**)&(_pointer_) )
#ifdef FT_DEBUG_MEMORY
# define MEM_Alloc( _pointer_, _size_ ) \
FT_Alloc_Debug( memory, _size_, (void**)&(_pointer_), __FILE__, __LINE__ )
# define MEM_Alloc_Array( _pointer_, _count_, _type_ ) \
FT_Alloc_Debug( memory, (_count_)*sizeof ( _type_ ), \
(void**)&(_pointer_), __FILE__, __LINE__ )
#else /* !FT_DEBUG_MEMORY */
# define MEM_Alloc( _pointer_, _size_ ) \
FT_Alloc( memory, _size_, (void**)&(_pointer_) )
# define MEM_Alloc_Array( _pointer_, _count_, _type_ ) \
FT_Alloc( memory, (_count_)*sizeof ( _type_ ), \
(void**)&(_pointer_) )
#endif /* !FT_DEBUG_MEMORY */
#define MEM_Realloc( _pointer_, _current_, _size_ ) \
FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) )

View File

@ -20,9 +20,13 @@
typedef struct FT_MemNodeRec_
{
FT_Byte* address;
FT_Long size; /* < 0 if the block was freed */
FT_MemNode link;
FT_Byte* address;
FT_Long size; /* < 0 if the block was freed */
const char* file_name;
FT_Long line_no;
FT_MemNode link;
} FT_MemNodeRec;
@ -36,6 +40,9 @@
FT_ULong alloc_total;
FT_ULong alloc_current;
const char* file_name;
FT_Long line_no;
} FT_MemTableRec;
#define FT_MEM_SIZE_MIN 7
@ -160,40 +167,6 @@
}
static FT_MemNode
ft_mem_node_new( FT_MemTable table,
FT_Pointer address,
FT_ULong size )
{
FT_MemNode node;
node = malloc( sizeof(*node) );
if ( node == NULL )
ft_mem_debug_panic( "not enough memory to run memory tests" );
node->link = NULL;
node->address = address;
node->size = size;
return node;
}
static void
ft_mem_node_destroy( FT_MemNode node,
FT_MemTable table )
{
if (node)
{
node->address = NULL;
node->size = 0;
node->link = NULL;
free( node );
}
}
static FT_MemTable
ft_mem_table_new( void )
@ -244,8 +217,10 @@
if ( node->size > 0 )
{
printf( "leaked memory block at address %p, size %ld\n",
node->address, node->size );
printf( "leaked memory block at address %p, size %8ld (%s:%d)\n",
node->address, node->size,
node->file_name ? node->file_name : "unknown_file",
node->line_no );
leak_count++;
leaks += node->size;
@ -337,9 +312,13 @@
if ( node == NULL )
ft_mem_debug_panic( "not enough memory to run memory tests" );
node->address = address;
node->size = size;
node->link = pnode[0];
node->address = address;
node->size = size;
node->file_name = table->file_name;
node->line_no = table->line_no;
node->link = pnode[0];
pnode[0] = node;
table->nodes++;
@ -494,6 +473,26 @@
}
}
FT_BASE_DEF( FT_Error )
FT_Alloc_Debug( FT_Memory memory,
FT_Long size,
void* *P,
const char* file_name,
FT_Long line_no )
{
FT_MemTable table = memory->user;
if ( table )
{
table->file_name = file_name;
table->line_no = line_no;
}
return FT_Alloc( memory, size, P );
}
#else /* !FT_DEBUG_MEMORY */
/* ansi C doesn't like empty source files */