diff --git a/ChangeLog b/ChangeLog index 5ebe61af..8d554b9d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -42,6 +42,7 @@ - added ARRAY interpretation for images - VipsStats tracks minpos/maxpos as well - moved mask/ to deprecated +- use atexit() to call vips_shutdown() 12/10/11 started 7.26.6 - NOCACHE was not being set correctly on OS X causing performance diff --git a/TODO b/TODO index 108ddc7c..38cace15 100644 --- a/TODO +++ b/TODO @@ -2,67 +2,10 @@ - -- im_open_local() is broken? try Adam's prog under 7.27 - - ... it's the operation cache, we just need to call vips_shutdown() - - - - - see: vips_abs_build(), should that set an arithmetic member? ugly - -- what about pipeline -> bandsplit -> min - - will that eval the pipe once for each band, or will caching stop that? - - nope, once for each band argh - - get im_stats() to report minpos and maxpos - - - - -- try: - - $ vips vips copy babe.png x.v - GLib-GObject-WARNING **: invalid cast from `VipsFormatVips' to - `VipsOperation' - - if( !(type = vips_type_find( "VipsOperation", "vips" )) ) - return( NULL ); - - is finding VipsFormatVips - - though VipsFormatVips is not a subclass of VipsOperation ?!?!? - - vips_type_find() was always searching the whole of VipsObject and ignoring - basename - - changed it back, but what will this break? there was a reason we got rid of - subclass searching I forget what - - - - - -- don't do vips_image_write() at the end of a pipeline, instead try: - - g_object_set( object, "out", t, NULL ); - - ie. replace the output object - - this doesn't work, I wonder why ... do we need to add an extra ref to t? - - yes, the old obj holds a ref to the operation, not the other way around - - - - - - vipsimage should be cached too, eg. VipsImage *a = vips_image_new_from_file( "poop.jpg" ); diff --git a/configure.in b/configure.in index 0db26c9d..edfdab23 100644 --- a/configure.in +++ b/configure.in @@ -266,7 +266,7 @@ AC_TYPE_SIZE_T AC_FUNC_MEMCMP AC_FUNC_MMAP AC_FUNC_VPRINTF -AC_CHECK_FUNCS([getcwd gettimeofday getwd memset munmap putenv realpath strcasecmp strchr strcspn strdup strerror strrchr strspn vsnprintf realpath mkstemp mktemp random rand sysconf]) +AC_CHECK_FUNCS([getcwd gettimeofday getwd memset munmap putenv realpath strcasecmp strchr strcspn strdup strerror strrchr strspn vsnprintf realpath mkstemp mktemp random rand sysconf atexit]) AC_CHECK_LIB(m,cbrt,[AC_DEFINE(HAVE_CBRT,1,[have cbrt() in libm.])]) AC_CHECK_LIB(m,hypot,[AC_DEFINE(HAVE_HYPOT,1,[have hypot() in libm.])]) diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index 915810e8..8be179b0 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -262,6 +262,13 @@ vips_init( const char *argv0 ) */ vips_vector_init(); + /* Register vips_shutdown(). This may well not get called and many + * platforms don't support it anyway. + */ +#ifdef HAVE_ATEXIT + atexit( vips_shutdown ); +#endif /*HAVE_ATEXIT*/ + done = TRUE; return( 0 ); @@ -280,38 +287,49 @@ vips_check_init( void ) vips_error_clear(); } +static void +vips_leak( void ) +{ + char txt[1024]; + VipsBuf buf = VIPS_BUF_STATIC( txt ); + + vips_object_print_all(); + + vips_buf_appendf( &buf, "memory: %d allocations, %zd bytes\n", + vips_tracked_get_allocs(), vips_tracked_get_mem() ); + vips_buf_appendf( &buf, "memory: high-water mark " ); + vips_buf_append_size( &buf, vips_tracked_get_mem_highwater() ); + vips_buf_appendf( &buf, "\nfiles: %d open\n", + vips_tracked_get_files() ); + + fprintf( stderr, "%s", vips_buf_all( &buf ) ); +} + /** * vips_shutdown: * * Call this to drop caches and close plugins. Run with "--vips-leak" to do - * a leak check too. + * a leak check too. May be called many times. */ void vips_shutdown( void ) { + static gboolean done = FALSE; + vips_cache_drop_all(); im_close_plugins(); - /* In dev releases, always show leaks. + /* In dev releases, always show leaks. But not more than once, it's + * annoying. */ #ifndef DEBUG_LEAK if( vips__leak ) #endif /*DEBUG_LEAK*/ { - char txt[1024]; - VipsBuf buf = VIPS_BUF_STATIC( txt ); + if( !done ) + vips_leak(); - vips_object_print_all(); - - vips_buf_appendf( &buf, "memory: %d allocations, %zd bytes\n", - vips_tracked_get_allocs(), - vips_tracked_get_mem() ); - vips_buf_appendf( &buf, "memory: high-water mark " ); - vips_buf_append_size( &buf, vips_tracked_get_mem_highwater() ); - vips_buf_appendf( &buf, "\nfiles: %d open\n", - vips_tracked_get_files() ); - - fprintf( stderr, "%s", vips_buf_all( &buf ) ); + done = TRUE; } }