Use gatomicrefcount in sinkscreen

This commit is contained in:
Kleis Auke Wolthuizen 2020-08-08 14:21:06 +02:00
parent 060ab7c7a2
commit 83575e347a
1 changed files with 25 additions and 1 deletions

View File

@ -106,8 +106,12 @@ typedef struct _Render {
* threads. We can't easily use the gobject ref count system since we * threads. We can't easily use the gobject ref count system since we
* need a lock around operations. * need a lock around operations.
*/ */
#if GLIB_CHECK_VERSION( 2, 58, 0 )
gatomicrefcount ref_count;
#else
int ref_count; int ref_count;
GMutex *ref_count_lock; GMutex *ref_count_lock;
#endif
/* Parameters. /* Parameters.
*/ */
@ -228,7 +232,11 @@ render_free( Render *render )
{ {
VIPS_DEBUG_MSG_AMBER( "render_free: %p\n", render ); VIPS_DEBUG_MSG_AMBER( "render_free: %p\n", render );
#if GLIB_CHECK_VERSION( 2, 58, 0 )
g_assert ( g_atomic_ref_count_compare( &render->ref_count, 0 ) );
#else
g_assert( render->ref_count == 0 ); g_assert( render->ref_count == 0 );
#endif
g_mutex_lock( render_dirty_lock ); g_mutex_lock( render_dirty_lock );
if( g_slist_find( render_dirty_all, render ) ) { if( g_slist_find( render_dirty_all, render ) ) {
@ -241,7 +249,9 @@ render_free( Render *render )
} }
g_mutex_unlock( render_dirty_lock ); g_mutex_unlock( render_dirty_lock );
#if !GLIB_CHECK_VERSION( 2, 58, 0 )
vips_g_mutex_free( render->ref_count_lock ); vips_g_mutex_free( render->ref_count_lock );
#endif
vips_g_mutex_free( render->lock ); vips_g_mutex_free( render->lock );
vips_slist_map2( render->all, (VipsSListMap2Fn) tile_free, NULL, NULL ); vips_slist_map2( render->all, (VipsSListMap2Fn) tile_free, NULL, NULL );
@ -266,10 +276,15 @@ render_free( Render *render )
static int static int
render_ref( Render *render ) render_ref( Render *render )
{ {
#if GLIB_CHECK_VERSION( 2, 58, 0 )
g_assert( !g_atomic_ref_count_compare( &render->ref_count, 0 ) );
g_atomic_ref_count_inc( &render->ref_count );
#else
g_mutex_lock( render->ref_count_lock ); g_mutex_lock( render->ref_count_lock );
g_assert( render->ref_count != 0 ); g_assert( render->ref_count != 0 );
render->ref_count += 1; render->ref_count += 1;
g_mutex_unlock( render->ref_count_lock ); g_mutex_unlock( render->ref_count_lock );
#endif
return( 0 ); return( 0 );
} }
@ -279,11 +294,16 @@ render_unref( Render *render )
{ {
int kill; int kill;
#if GLIB_CHECK_VERSION( 2, 58, 0 )
g_assert( !g_atomic_ref_count_compare( &render->ref_count, 0 ) );
kill = g_atomic_ref_count_dec( &render->ref_count );
#else
g_mutex_lock( render->ref_count_lock ); g_mutex_lock( render->ref_count_lock );
g_assert( render->ref_count > 0 ); g_assert( render->ref_count > 0 );
render->ref_count -= 1; render->ref_count -= 1;
kill = render->ref_count == 0; kill = render->ref_count == 0;
g_mutex_unlock( render->ref_count_lock ); g_mutex_unlock( render->ref_count_lock );
#endif
if( kill ) if( kill )
render_free( render ); render_free( render );
@ -554,8 +574,12 @@ render_new( VipsImage *in, VipsImage *out, VipsImage *mask,
*/ */
g_object_ref( in ); g_object_ref( in );
#if GLIB_CHECK_VERSION( 2, 58, 0 )
g_atomic_ref_count_init( &render->ref_count );
#else
render->ref_count = 1; render->ref_count = 1;
render->ref_count_lock = vips_g_mutex_new(); render->ref_count_lock = vips_g_mutex_new();
#endif
render->in = in; render->in = in;
render->out = out; render->out = out;