make VipsArea leakcheck a run-time option

was compile-time
This commit is contained in:
John Cupitt 2013-07-16 11:37:01 +01:00
parent e36d8a843b
commit 67a5aa7442
4 changed files with 17 additions and 9 deletions

View File

@ -44,7 +44,7 @@ Static analysis with:
Leak check: Leak check:
$ export G_DEBUG=gc-friendly $ export G_DEBUG=gc-friendly
$ export G_SLICE=always-malloc $ export G_SLICE=always-malloc
$ valgrind --suppressions=/home/john/nip2.supp \ $ valgrind --suppressions=/home/john/nip2.supp \
--leak-check=yes \ --leak-check=yes \

View File

@ -71,6 +71,10 @@ extern int vips__concurrency;
*/ */
extern int vips__fatal; extern int vips__fatal;
/* Enable leak check.
*/
extern int vips__leak;
/* Give progress feedback. /* Give progress feedback.
*/ */
extern int vips__progress; extern int vips__progress;

View File

@ -96,7 +96,7 @@ static char *vips__argv0 = NULL;
/* Leak check on exit. /* Leak check on exit.
*/ */
static int vips__leak = 0; int vips__leak = 0;
/** /**
* vips_get_argv0: * vips_get_argv0:

View File

@ -5,6 +5,8 @@
* *
* 27/10/11 * 27/10/11
* - from header.c * - from header.c
* 16/7/13
* - leakcheck VipsArea
*/ */
/* /*
@ -141,9 +143,7 @@ vips_thing_get_type( void )
* strings. * strings.
*/ */
#ifdef DEBUG
static GSList *vips_area_all = NULL; static GSList *vips_area_all = NULL;
#endif /*DEBUG*/
VipsArea * VipsArea *
vips_area_copy( VipsArea *area ) vips_area_copy( VipsArea *area )
@ -174,9 +174,11 @@ vips_area_unref( VipsArea *area )
#ifdef DEBUG #ifdef DEBUG
printf( "vips_area_unref: %p count = %d\n", area, area->count ); printf( "vips_area_unref: %p count = %d\n", area, area->count );
g_assert( g_slist_find( vips_area_all, area ) );
#endif /*DEBUG*/ #endif /*DEBUG*/
if( vips__leak )
g_assert( g_slist_find( vips_area_all, area ) );
if( area->count == 0 ) { if( area->count == 0 ) {
if( area->free_fn && area->data ) { if( area->free_fn && area->data ) {
area->free_fn( area->data, area ); area->free_fn( area->data, area );
@ -190,8 +192,10 @@ vips_area_unref( VipsArea *area )
g_free( area ); g_free( area );
if( vips__leak )
vips_area_all = g_slist_remove( vips_area_all, area );
#ifdef DEBUG #ifdef DEBUG
vips_area_all = g_slist_remove( vips_area_all, area );
printf( "vips_area_unref: free .. total = %d\n", printf( "vips_area_unref: free .. total = %d\n",
g_slist_length( vips_area_all ) ); g_slist_length( vips_area_all ) );
#endif /*DEBUG*/ #endif /*DEBUG*/
@ -226,8 +230,10 @@ vips_area_new( VipsCallbackFn free_fn, void *data )
area->type = 0; area->type = 0;
area->sizeof_type = 0; area->sizeof_type = 0;
if( vips__leak )
vips_area_all = g_slist_prepend( vips_area_all, area );
#ifdef DEBUG #ifdef DEBUG
vips_area_all = g_slist_prepend( vips_area_all, area );
printf( "vips_area_new: %p count = %d (%d in total)\n", printf( "vips_area_new: %p count = %d (%d in total)\n",
area, area->count, area, area->count,
g_slist_length( vips_area_all ) ); g_slist_length( vips_area_all ) );
@ -239,7 +245,6 @@ vips_area_new( VipsCallbackFn free_fn, void *data )
void void
vips__type_leak( void ) vips__type_leak( void )
{ {
#ifdef DEBUG
if( vips_area_all ) { if( vips_area_all ) {
GSList *p; GSList *p;
@ -251,7 +256,6 @@ vips__type_leak( void )
} }
printf( "%d in total\n", g_slist_length( vips_area_all ) ); printf( "%d in total\n", g_slist_length( vips_area_all ) );
} }
#endif /*DEBUG*/
} }
/** /**