Merge pull request #1240 from jtorresfabra/fix_hidden_threapool_leak

Fix for hidden leaks in ThreadPool
This commit is contained in:
John Cupitt 2019-02-27 13:41:17 +00:00 committed by GitHub
commit 3324ed8a2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -579,6 +579,9 @@ vips_thread_free( VipsThread *thr )
VIPS_FREEF( g_object_unref, thr->state ); VIPS_FREEF( g_object_unref, thr->state );
thr->pool = NULL; thr->pool = NULL;
/* Free the thread memory
*/
g_free(thr);
} }
static int static int
@ -703,7 +706,7 @@ vips_thread_new( VipsThreadpool *pool )
{ {
VipsThread *thr; VipsThread *thr;
if( !(thr = VIPS_NEW( pool->im, VipsThread )) ) if( !(thr = VIPS_NEW( NULL, VipsThread )) )
return( NULL ); return( NULL );
thr->pool = pool; thr->pool = pool;
thr->state = NULL; thr->state = NULL;
@ -738,7 +741,9 @@ vips_threadpool_kill_threads( VipsThreadpool *pool )
vips_thread_free( pool->thr[i] ); vips_thread_free( pool->thr[i] );
pool->thr[i] = NULL; pool->thr[i] = NULL;
} }
/* Free the thread array
*/
g_free(pool->thr);
pool->thr = NULL; pool->thr = NULL;
VIPS_DEBUG_MSG( "vips_threadpool_kill_threads: " VIPS_DEBUG_MSG( "vips_threadpool_kill_threads: "
@ -758,7 +763,9 @@ vips_threadpool_free( VipsThreadpool *pool )
VIPS_FREEF( vips_g_mutex_free, pool->allocate_lock ); VIPS_FREEF( vips_g_mutex_free, pool->allocate_lock );
vips_semaphore_destroy( &pool->finish ); vips_semaphore_destroy( &pool->finish );
vips_semaphore_destroy( &pool->tick ); vips_semaphore_destroy( &pool->tick );
/* Free pool memory
*/
g_free(pool);
return( 0 ); return( 0 );
} }
@ -779,7 +786,7 @@ vips_threadpool_new( VipsImage *im )
/* Allocate and init new thread block. /* Allocate and init new thread block.
*/ */
if( !(pool = VIPS_NEW( im, VipsThreadpool )) ) if( !(pool = VIPS_NEW( NULL, VipsThreadpool )) )
return( NULL ); return( NULL );
pool->im = im; pool->im = im;
pool->allocate = NULL; pool->allocate = NULL;
@ -802,11 +809,6 @@ vips_threadpool_new( VipsImage *im )
n_tiles = VIPS_CLIP( 0, n_tiles, MAX_THREADS ); n_tiles = VIPS_CLIP( 0, n_tiles, MAX_THREADS );
pool->nthr = VIPS_MIN( pool->nthr, n_tiles ); pool->nthr = VIPS_MIN( pool->nthr, n_tiles );
/* Attach tidy-up callback.
*/
g_signal_connect( im, "close",
G_CALLBACK( vips_threadpool_new_cb ), pool );
VIPS_DEBUG_MSG( "vips_threadpool_new: \"%s\" (%p), with %d threads\n", VIPS_DEBUG_MSG( "vips_threadpool_new: \"%s\" (%p), with %d threads\n",
im->filename, pool, pool->nthr ); im->filename, pool, pool->nthr );
@ -824,7 +826,7 @@ vips_threadpool_create_threads( VipsThreadpool *pool )
/* Make thread array. /* Make thread array.
*/ */
if( !(pool->thr = VIPS_ARRAY( pool->im, pool->nthr, VipsThread * )) ) if( !(pool->thr = VIPS_ARRAY( NULL, pool->nthr, VipsThread * )) )
return( -1 ); return( -1 );
for( i = 0; i < pool->nthr; i++ ) for( i = 0; i < pool->nthr; i++ )
pool->thr[i] = NULL; pool->thr[i] = NULL;