diff --git a/README.md b/README.md index b60af699..654c0e21 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Static analysis with: Leak check: - $ export G_DEBUG=gc-friendly + $ export G_DEBUG=gc-friendly $ export G_SLICE=always-malloc $ valgrind --suppressions=/home/john/nip2.supp \ --leak-check=yes \ diff --git a/libvips/include/vips/internal.h b/libvips/include/vips/internal.h index b21c837c..ddf7798e 100644 --- a/libvips/include/vips/internal.h +++ b/libvips/include/vips/internal.h @@ -71,6 +71,10 @@ extern int vips__concurrency; */ extern int vips__fatal; +/* Enable leak check. + */ +extern int vips__leak; + /* Give progress feedback. */ extern int vips__progress; diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index ebdbd634..a1467444 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -96,7 +96,7 @@ static char *vips__argv0 = NULL; /* Leak check on exit. */ -static int vips__leak = 0; +int vips__leak = 0; /** * vips_get_argv0: diff --git a/libvips/iofuncs/type.c b/libvips/iofuncs/type.c index f9bc0f3e..84ecf351 100644 --- a/libvips/iofuncs/type.c +++ b/libvips/iofuncs/type.c @@ -5,6 +5,8 @@ * * 27/10/11 * - from header.c + * 16/7/13 + * - leakcheck VipsArea */ /* @@ -141,9 +143,7 @@ vips_thing_get_type( void ) * strings. */ -#ifdef DEBUG static GSList *vips_area_all = NULL; -#endif /*DEBUG*/ VipsArea * vips_area_copy( VipsArea *area ) @@ -174,9 +174,11 @@ vips_area_unref( VipsArea *area ) #ifdef DEBUG printf( "vips_area_unref: %p count = %d\n", area, area->count ); - g_assert( g_slist_find( vips_area_all, area ) ); #endif /*DEBUG*/ + if( vips__leak ) + g_assert( g_slist_find( vips_area_all, area ) ); + if( area->count == 0 ) { if( area->free_fn && area->data ) { area->free_fn( area->data, area ); @@ -190,8 +192,10 @@ vips_area_unref( VipsArea *area ) g_free( area ); + if( vips__leak ) + vips_area_all = g_slist_remove( vips_area_all, area ); + #ifdef DEBUG - vips_area_all = g_slist_remove( vips_area_all, area ); printf( "vips_area_unref: free .. total = %d\n", g_slist_length( vips_area_all ) ); #endif /*DEBUG*/ @@ -226,8 +230,10 @@ vips_area_new( VipsCallbackFn free_fn, void *data ) area->type = 0; area->sizeof_type = 0; + if( vips__leak ) + vips_area_all = g_slist_prepend( vips_area_all, area ); + #ifdef DEBUG - vips_area_all = g_slist_prepend( vips_area_all, area ); printf( "vips_area_new: %p count = %d (%d in total)\n", area, area->count, g_slist_length( vips_area_all ) ); @@ -239,7 +245,6 @@ vips_area_new( VipsCallbackFn free_fn, void *data ) void vips__type_leak( void ) { -#ifdef DEBUG if( vips_area_all ) { GSList *p; @@ -251,7 +256,6 @@ vips__type_leak( void ) } printf( "%d in total\n", g_slist_length( vips_area_all ) ); } -#endif /*DEBUG*/ } /**