ref: 5a1de37e7e1a2fdc1a5ef1679850b8964975d09b
parent: 3a65746f1de20623607ee96a240fd9037c037224
author: David Turner <[email protected]>
date: Wed Oct 24 03:32:55 EDT 2001
replaced liberal uses of "memset" by the "MEM_Set" macro call (some platforms don't provide this ANSI function !!) some changes to "ftsystem.c" implementations in order to use the new memory debugger on Unix, VMS and Amiga too !!
--- a/builds/amiga/src/base/ftsystem.c
+++ b/builds/amiga/src/base/ftsystem.c
@@ -346,6 +346,18 @@
}
+
+#ifdef FT_DEBUG_MEMORY
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory );
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory );
+
+#endif
+
+
/* documentation is in ftobjs.h */
FT_EXPORT_DEF( FT_Memory )
@@ -360,14 +372,20 @@
{
// memory->user = 0;
memory->user = AsmCreatePool ( MEMF_PUBLIC, 2048, 2048, SysBase );
- memory->alloc = ft_alloc;
- memory->realloc = ft_realloc;
- memory->free = ft_free;
if ( memory->user == NULL )
{
FreeVec ( memory );
memory = NULL;
}
+ else
+ {
+ memory->alloc = ft_alloc;
+ memory->realloc = ft_realloc;
+ memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
+ }
}
return memory;
@@ -379,7 +397,9 @@
FT_EXPORT_DEF( void )
FT_Done_Memory( FT_Memory memory )
{
-// memory->free( memory, memory );
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_done( memory );
+#endif
AsmDeletePool( memory->user, SysBase );
FreeVec( memory );
--- a/builds/unix/ftsystem.c
+++ b/builds/unix/ftsystem.c
@@ -271,6 +271,17 @@
}
+#ifdef FT_DEBUG_MEMORY
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory );
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory );
+
+#endif
+
+
/* documentation is in ftobjs.h */
FT_EXPORT_DEF( FT_Memory )
@@ -281,11 +292,13 @@
memory = (FT_Memory)malloc( sizeof ( *memory ) );
if ( memory )
- {
memory->user = 0;
memory->alloc = ft_alloc;
memory->realloc = ft_realloc;
memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
}
return memory;
@@ -297,6 +310,9 @@
FT_EXPORT_DEF( void )
FT_Done_Memory( FT_Memory memory )
{
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_done( memory );
+#endif
memory->free( memory, memory );
}
--- a/builds/vms/ftsystem.c
+++ b/builds/vms/ftsystem.c
@@ -271,6 +271,17 @@
}
+#ifdef FT_DEBUG_MEMORY
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory );
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory );
+
+#endif
+
+
/* documentation is in ftobjs.h */
FT_EXPORT_DEF( FT_Memory )
@@ -286,6 +297,9 @@
memory->alloc = ft_alloc;
memory->realloc = ft_realloc;
memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
}
return memory;
@@ -297,6 +311,9 @@
FT_EXPORT_DEF( void )
FT_Done_Memory( FT_Memory memory )
{
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_done( memory );
+#endif
memory->free( memory, memory );
}
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -161,7 +161,7 @@
/* available on all platforms we know of. */
#include <string.h>
-#define MEM_Set( dest, byte, count ) memset( dest, byte, count )
+#define MEM_Set( dest, byte, count ) memset( dest, byte, count )
#define MEM_Copy( dest, source, count ) memcpy( dest, source, count )
--- a/src/autohint/ahglyph.c
+++ b/src/autohint/ahglyph.c
@@ -816,7 +816,7 @@
segment_dir = point->out_dir;
/* clear all segment fields */
- memset( segment, 0, sizeof ( *segment ) );
+ MEM_Set( segment, 0, sizeof ( *segment ) );
segment->dir = segment_dir;
segment->flags = ah_edge_normal;
@@ -878,7 +878,7 @@
if ( min_point )
{
/* clear all segment fields */
- memset( segment, 0, sizeof ( *segment ) );
+ MEM_Set( segment, 0, sizeof ( *segment ) );
segment->dir = segment_dir;
segment->flags = ah_edge_normal;
@@ -894,7 +894,7 @@
if ( max_point )
{
/* clear all segment fields */
- memset( segment, 0, sizeof ( *segment ) );
+ MEM_Set( segment, 0, sizeof ( *segment ) );
segment->dir = segment_dir;
segment->flags = ah_edge_normal;
@@ -1122,7 +1122,7 @@
edge_limit++;
/* clear all edge fields */
- memset( edge, 0, sizeof ( *edge ) );
+ MEM_Set( edge, 0, sizeof ( *edge ) );
/* add the segment to the new edge's list */
edge->first = seg;
--- a/src/base/ftdbgmem.c
+++ b/src/base/ftdbgmem.c
@@ -32,7 +32,6 @@
typedef struct FT_MemTableRec_
{
- FT_Memory memory;
FT_ULong size;
FT_ULong nodes;
FT_MemNode* buckets;
@@ -43,6 +42,12 @@
const char* file_name;
FT_Long line_no;
+
+ FT_Memory memory;
+ FT_Pointer memory_user;
+ FT_Alloc_Func alloc;
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
} FT_MemTableRec;
@@ -122,8 +127,33 @@
}
+ static FT_Pointer
+ ft_mem_table_alloc( FT_MemTable table,
+ FT_Long size )
+ {
+ FT_Memory memory = table->memory;
+ FT_Pointer block;
+
+ memory->user = table->memory_user;
+ block = table->alloc( memory, size );
+ memory->user = table;
+
+ return block;
+ }
static void
+ ft_mem_table_free( FT_MemTable table,
+ FT_Pointer block )
+ {
+ FT_Memory memory = table->memory;
+
+ memory->user = table->memory_user;
+ table->free( memory, block );
+ memory->user = table;
+ }
+
+
+ static void
ft_mem_table_resize( FT_MemTable table )
{
FT_ULong new_size;
@@ -134,7 +164,7 @@
FT_MemNode* new_buckets ;
FT_ULong i;
- new_buckets = malloc( new_size * sizeof(FT_MemNode) );
+ new_buckets = ft_mem_table_alloc( table, new_size * sizeof(FT_MemNode) );
if ( new_buckets == NULL )
return;
@@ -160,7 +190,7 @@
}
if ( table->buckets )
- free( table->buckets );
+ ft_mem_table_free( table, table->buckets );
table->buckets = new_buckets;
table->size = new_size;
@@ -169,11 +199,11 @@
static FT_MemTable
- ft_mem_table_new( void )
+ ft_mem_table_new( FT_Memory memory )
{
FT_MemTable table;
- table = malloc( sizeof(*table) );
+ table = memory->alloc( memory, sizeof(*table) );
if ( table == NULL ) goto Exit;
memset( table, 0, sizeof(*table) );
@@ -180,13 +210,21 @@
table->size = FT_MEM_SIZE_MIN;
table->nodes = 0;
+
+ table->memory = memory;
- table->buckets = malloc( table->size * sizeof(FT_MemNode) );
+ table->memory_user = memory->user;
+
+ table->alloc = memory->alloc;
+ table->realloc = memory->realloc;
+ table->free = memory->free;
+
+ table->buckets = memory->alloc( memory, table->size * sizeof(FT_MemNode) );
if ( table->buckets )
memset( table->buckets, 0, sizeof(FT_MemNode)*table->size );
else
{
- free( table );
+ memory->free( memory, table );
table = NULL;
}
@@ -203,8 +241,9 @@
if ( table )
{
- FT_Long leak_count = 0;
- FT_ULong leaks = 0;
+ FT_Memory memory = table->memory;
+ FT_Long leak_count = 0;
+ FT_ULong leaks = 0;
for ( i = 0; i < table->size; i++ )
{
@@ -225,7 +264,7 @@
leak_count++;
leaks += node->size;
- free( node->address );
+ ft_mem_table_free( table, node->address );
}
node->address = NULL;
@@ -236,7 +275,7 @@
}
table->buckets[i] = 0;
}
- free( table->buckets );
+ ft_mem_table_free( table, table->buckets );
table->buckets = NULL;
table->size = 0;
@@ -311,7 +350,7 @@
}
/* we need to create a new node in this table */
- node = malloc( sizeof(*node) );
+ node = ft_mem_table_alloc( table, sizeof(*node) );
if ( node == NULL )
ft_mem_debug_panic( "not enough memory to run memory tests" );
@@ -378,7 +417,7 @@
if ( size <= 0 )
ft_mem_debug_panic( "negative block size allocation (%ld)", size );
- block = malloc( size );
+ block = ft_mem_table_alloc( table, size );
if ( block )
ft_mem_table_set( table, block, (FT_ULong)size );
@@ -454,7 +493,7 @@
if ( getenv( "FT_DEBUG_MEMORY") )
{
- table = ft_mem_table_new();
+ table = ft_mem_table_new( memory );
if ( table )
{
memory->user = table;
@@ -475,9 +514,12 @@
if ( table )
{
+ memory->free = table->free;
+ memory->realloc = table->realloc;
+ memory->alloc = table->alloc;
+
ft_mem_table_destroy( table );
memory->user = NULL;
- memory->free = (FT_Free_Func) free;
}
}
--- a/src/base/ftsystem.c
+++ b/src/base/ftsystem.c
@@ -276,14 +276,14 @@
memory = (FT_Memory)malloc( sizeof ( *memory ) );
if ( memory )
-#ifdef FT_DEBUG_MEMORY
- if ( !ft_mem_debug_init( memory ) )
-#endif
{
memory->user = 0;
memory->alloc = ft_alloc;
memory->realloc = ft_realloc;
memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
}
return memory;
--- a/src/raster/ftraster.c
+++ b/src/raster/ftraster.c
@@ -105,6 +105,10 @@
/*************************************************************************/
/*************************************************************************/
+#ifdef MEM_Set
+# define MEM_Set(d,s,c) memset(d,s,c)
+#endif
+
/* define DEBUG_RASTER if you want to compile a debugging version */
#define xxxDEBUG_RASTER
@@ -3141,7 +3145,7 @@
*araster = &the_raster;
- memset( &the_raster, sizeof ( the_raster ), 0 );
+ MEM_Set( &the_raster, sizeof ( the_raster ), 0 );
ft_black_init( &the_raster );
return 0;
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -140,6 +140,10 @@
#endif /* _STANDALONE_ */
+#ifndef MEM_Set
+# define MEM_Set(d,s,c) memset(d,s,c)
+#endif
+
/* define this to dump debugging information */
#define xxxDEBUG_GRAYS
@@ -1228,7 +1232,7 @@
{
if ( spans->coverage )
#if 1
- memset( p + spans->x, (unsigned char)spans->coverage, spans->len );
+ MEM_Set( p + spans->x, (unsigned char)spans->coverage, spans->len );
#else /* 1 */
{
q = p + spans->x;
@@ -1968,7 +1972,7 @@
*araster = (FT_Raster)&the_raster;
- memset( &the_raster, 0, sizeof ( the_raster ) );
+ MEM_Set( &the_raster, 0, sizeof ( the_raster ) );
return 0;
}