Commit 2a98b3c4 authored by David Turner's avatar David Turner
Browse files

reduced some nasty memory leaks

parent 90f68b72
......@@ -161,7 +161,7 @@ else
# The list of demonstration programs to build.
#
# EXES := ftlint ftview fttimer compos ftstring memtest ftmulti
EXES := ftlint ftview
EXES := ftlint ftview fttimer ftstring memtest ftmulti
ifneq ($(findstring $(PLATFORM),os2 unix win32),)
EXES += ttdebug
......
......@@ -42,6 +42,12 @@ typedef struct MyBlock
static MyBlock my_blocks[ MAX_RECORDED_BLOCKS ];
static int num_my_blocks = 0;
static
void rewind_memory( void )
{
num_my_blocks = 0;
}
/* record a new block in the table, check for duplicates too */
static
void record_my_block( void* base, long size )
......@@ -100,13 +106,13 @@ void forget_my_block( void* base )
}
else
{
fprintf( stderr, "Block at %08lx released twice \n", (long)base );
fprintf( stderr, "Block at %p released twice \n", base );
exit(1);
}
}
}
fprintf( stderr, "Trying to release an unallocated block at %08lx\n",
(long)base );
fprintf( stderr, "Trying to release an unallocated block at %p\n",
base );
exit(1);
}
......@@ -126,7 +132,7 @@ static
void my_free( FT_Memory memory, void* block )
{
forget_my_block(block);
free(block);
/* free(block); WE DO NOT REALLY FREE THE BLOCK */
}
static
......@@ -140,9 +146,16 @@ void* my_realloc( FT_Memory memory,
p = my_alloc( memory, new_size );
if (p)
{
long size;
size = cur_size;
if (new_size < size)
size = new_size;
memcpy( p, block, size );
my_free( memory, block );
record_my_block( p, new_size );
}
return p;
}
......@@ -168,7 +181,7 @@ static void dump_mem( void )
{
if (block->size > 0)
{
fprintf( stderr, "%08lx (%6ld bytes) leaked !!\n", (long)block->base, (long)block->size );
fprintf( stderr, "%p (%6ld bytes) leaked !!\n", block->base, (long)block->size );
bad = 1;
}
}
......
......@@ -1337,6 +1337,7 @@
else
error = FT_Err_Invalid_Handle;
ft_done_stream( &stream );
goto Fail;
}
else
......@@ -1371,6 +1372,8 @@
}
}
ft_done_stream( &stream );
/* no driver is able to handle this format */
error = FT_Err_Unknown_File_Format;
goto Fail;
......
......@@ -392,8 +392,6 @@
}
}
FORGET_Frame();
/* clear the touch tags */
for ( n = 0; n < n_points; n++ )
outline->tags[n] &= FT_Curve_Tag_On;
......
......@@ -1245,9 +1245,10 @@
/* copy recorder sub-routines */
T1_Done_Table( &parser->table );
parser->subrs = parser->table.block;
type1->subrs = parser->table.elements;
type1->subrs_len = parser->table.lengths;
parser->subrs = parser->table.block;
type1->subrs = parser->table.elements;
type1->subrs_len = parser->table.lengths;
type1->subrs_block = parser->table.block;
parser->state_index--;
}
......
......@@ -467,6 +467,11 @@
}
while (1);
/* we must free the field "tokzer.base" if we're in a disk-based */
/* PFB file.. */
if (stream->read)
FREE( tokzer->base );
tokzer->base = private;
tokzer->cursor = 0;
tokzer->limit = private_size;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment