diff --git a/libvips/include/vips/internal.h b/libvips/include/vips/internal.h index 84030580..d549c321 100644 --- a/libvips/include/vips/internal.h +++ b/libvips/include/vips/internal.h @@ -114,7 +114,6 @@ void vips__threadpool_init( void ); void vips__cache_init( void ); -void vips__sink_screen_init( void ); void vips__print_renders( void ); void vips__type_leak( void ); diff --git a/libvips/iofuncs/init.c b/libvips/iofuncs/init.c index 7c9cd5d9..aa1b5901 100644 --- a/libvips/iofuncs/init.c +++ b/libvips/iofuncs/init.c @@ -413,7 +413,6 @@ vips_init( const char *argv0 ) #endif /*HAVE_THREAD_NEW*/ vips__threadpool_init(); - vips__sink_screen_init(); vips__buffer_init(); vips__meta_init(); diff --git a/libvips/iofuncs/sinkscreen.c b/libvips/iofuncs/sinkscreen.c index 9c216e59..c432cdcf 100644 --- a/libvips/iofuncs/sinkscreen.c +++ b/libvips/iofuncs/sinkscreen.c @@ -450,6 +450,9 @@ vips__render_shutdown( void ) } else g_mutex_unlock( render_dirty_lock ); + + VIPS_FREEF( vips_g_mutex_free, render_dirty_lock ); + vips_semaphore_destroy( &n_render_dirty_sem ); } } @@ -1027,8 +1030,8 @@ render_thread_main( void *client ) return( NULL ); } -void -vips__sink_screen_init( void ) +static void * +vips__sink_screen_init( void *data ) { g_assert( !render_thread ); g_assert( !render_dirty_lock ); @@ -1037,6 +1040,8 @@ vips__sink_screen_init( void ) vips_semaphore_init( &n_render_dirty_sem, 0, "n_render_dirty" ); render_thread = vips_g_thread_new( "sink_screen", render_thread_main, NULL ); + + return( NULL ); } /** @@ -1096,8 +1101,12 @@ vips_sink_screen( VipsImage *in, VipsImage *out, VipsImage *mask, int priority, VipsSinkNotify notify_fn, void *a ) { + static GOnce once = G_ONCE_INIT; + Render *render; + VIPS_ONCE( &once, vips__sink_screen_init, NULL ); + if( tile_width <= 0 || tile_height <= 0 || max_tiles < -1 ) { vips_error( "vips_sink_screen", "%s", _( "bad parameters" ) );