| OLD | NEW |
| 1 /***************************************************************************/ | 1 /***************************************************************************/ |
| 2 /* */ | 2 /* */ |
| 3 /* ftdbgmem.c */ | 3 /* ftdbgmem.c */ |
| 4 /* */ | 4 /* */ |
| 5 /* Memory debugger (body). */ | 5 /* Memory debugger (body). */ |
| 6 /* */ | 6 /* */ |
| 7 /* Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2009 by */ | 7 /* Copyright 2001-2006, 2009, 2013 by */ |
| 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
| 9 /* */ | 9 /* */ |
| 10 /* This file is part of the FreeType project, and may only be used, */ | 10 /* This file is part of the FreeType project, and may only be used, */ |
| 11 /* modified, and distributed under the terms of the FreeType project */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
| 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
| 13 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
| 14 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
| 15 /* */ | 15 /* */ |
| 16 /***************************************************************************/ | 16 /***************************************************************************/ |
| 17 | 17 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 | 337 |
| 338 Exit: | 338 Exit: |
| 339 return table; | 339 return table; |
| 340 } | 340 } |
| 341 | 341 |
| 342 | 342 |
| 343 static void | 343 static void |
| 344 ft_mem_table_destroy( FT_MemTable table ) | 344 ft_mem_table_destroy( FT_MemTable table ) |
| 345 { | 345 { |
| 346 FT_ULong i; | 346 FT_ULong i; |
| 347 FT_Long leak_count = 0; |
| 348 FT_ULong leaks = 0; |
| 347 | 349 |
| 348 | 350 |
| 349 FT_DumpMemory( table->memory ); | 351 FT_DumpMemory( table->memory ); |
| 350 | 352 |
| 351 if ( table ) | 353 /* remove all blocks from the table, revealing leaked ones */ |
| 354 for ( i = 0; i < table->size; i++ ) |
| 352 { | 355 { |
| 353 FT_Long leak_count = 0; | 356 FT_MemNode *pnode = table->buckets + i, next, node = *pnode; |
| 354 FT_ULong leaks = 0; | |
| 355 | 357 |
| 356 | 358 |
| 357 /* remove all blocks from the table, revealing leaked ones */ | 359 while ( node ) |
| 358 for ( i = 0; i < table->size; i++ ) | |
| 359 { | 360 { |
| 360 FT_MemNode *pnode = table->buckets + i, next, node = *pnode; | 361 next = node->link; |
| 362 node->link = 0; |
| 363 |
| 364 if ( node->size > 0 ) |
| 365 { |
| 366 printf( |
| 367 "leaked memory block at address %p, size %8ld in (%s:%ld)\n", |
| 368 node->address, node->size, |
| 369 FT_FILENAME( node->source->file_name ), |
| 370 node->source->line_no ); |
| 371 |
| 372 leak_count++; |
| 373 leaks += node->size; |
| 374 |
| 375 ft_mem_table_free( table, node->address ); |
| 376 } |
| 377 |
| 378 node->address = NULL; |
| 379 node->size = 0; |
| 380 |
| 381 ft_mem_table_free( table, node ); |
| 382 node = next; |
| 383 } |
| 384 table->buckets[i] = 0; |
| 385 } |
| 386 |
| 387 ft_mem_table_free( table, table->buckets ); |
| 388 table->buckets = NULL; |
| 389 |
| 390 table->size = 0; |
| 391 table->nodes = 0; |
| 392 |
| 393 /* remove all sources */ |
| 394 for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) |
| 395 { |
| 396 FT_MemSource source, next; |
| 361 | 397 |
| 362 | 398 |
| 363 while ( node ) | 399 for ( source = table->sources[i]; source != NULL; source = next ) |
| 364 { | 400 { |
| 365 next = node->link; | 401 next = source->link; |
| 366 node->link = 0; | 402 ft_mem_table_free( table, source ); |
| 367 | |
| 368 if ( node->size > 0 ) | |
| 369 { | |
| 370 printf( | |
| 371 "leaked memory block at address %p, size %8ld in (%s:%ld)\n", | |
| 372 node->address, node->size, | |
| 373 FT_FILENAME( node->source->file_name ), | |
| 374 node->source->line_no ); | |
| 375 | |
| 376 leak_count++; | |
| 377 leaks += node->size; | |
| 378 | |
| 379 ft_mem_table_free( table, node->address ); | |
| 380 } | |
| 381 | |
| 382 node->address = NULL; | |
| 383 node->size = 0; | |
| 384 | |
| 385 ft_mem_table_free( table, node ); | |
| 386 node = next; | |
| 387 } | |
| 388 table->buckets[i] = 0; | |
| 389 } | 403 } |
| 390 | 404 |
| 391 ft_mem_table_free( table, table->buckets ); | 405 table->sources[i] = NULL; |
| 392 table->buckets = NULL; | 406 } |
| 393 | 407 |
| 394 table->size = 0; | 408 printf( "FreeType: total memory allocations = %ld\n", |
| 395 table->nodes = 0; | 409 table->alloc_total ); |
| 410 printf( "FreeType: maximum memory footprint = %ld\n", |
| 411 table->alloc_max ); |
| 396 | 412 |
| 397 /* remove all sources */ | 413 ft_mem_table_free( table, table ); |
| 398 for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) | |
| 399 { | |
| 400 FT_MemSource source, next; | |
| 401 | 414 |
| 415 if ( leak_count > 0 ) |
| 416 ft_mem_debug_panic( |
| 417 "FreeType: %ld bytes of memory leaked in %ld blocks\n", |
| 418 leaks, leak_count ); |
| 402 | 419 |
| 403 for ( source = table->sources[i]; source != NULL; source = next ) | 420 printf( "FreeType: no memory leaks detected\n" ); |
| 404 { | |
| 405 next = source->link; | |
| 406 ft_mem_table_free( table, source ); | |
| 407 } | |
| 408 | |
| 409 table->sources[i] = NULL; | |
| 410 } | |
| 411 | |
| 412 printf( | |
| 413 "FreeType: total memory allocations = %ld\n", table->alloc_total ); | |
| 414 printf( | |
| 415 "FreeType: maximum memory footprint = %ld\n", table->alloc_max ); | |
| 416 | |
| 417 ft_mem_table_free( table, table ); | |
| 418 | |
| 419 if ( leak_count > 0 ) | |
| 420 ft_mem_debug_panic( | |
| 421 "FreeType: %ld bytes of memory leaked in %ld blocks\n", | |
| 422 leaks, leak_count ); | |
| 423 | |
| 424 printf( "FreeType: no memory leaks detected\n" ); | |
| 425 } | |
| 426 } | 421 } |
| 427 | 422 |
| 428 | 423 |
| 429 static FT_MemNode* | 424 static FT_MemNode* |
| 430 ft_mem_table_get_nodep( FT_MemTable table, | 425 ft_mem_table_get_nodep( FT_MemTable table, |
| 431 FT_Byte* address ) | 426 FT_Byte* address ) |
| 432 { | 427 { |
| 433 FT_PtrDist hash; | 428 FT_PtrDist hash; |
| 434 FT_MemNode *pnode, node; | 429 FT_MemNode *pnode, node; |
| 435 | 430 |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 | 983 |
| 989 #else /* !FT_DEBUG_MEMORY */ | 984 #else /* !FT_DEBUG_MEMORY */ |
| 990 | 985 |
| 991 /* ANSI C doesn't like empty source files */ | 986 /* ANSI C doesn't like empty source files */ |
| 992 typedef int _debug_mem_dummy; | 987 typedef int _debug_mem_dummy; |
| 993 | 988 |
| 994 #endif /* !FT_DEBUG_MEMORY */ | 989 #endif /* !FT_DEBUG_MEMORY */ |
| 995 | 990 |
| 996 | 991 |
| 997 /* END */ | 992 /* END */ |
| OLD | NEW |