Use gatomicrefcount in sinkscreen
This commit is contained in:
parent
060ab7c7a2
commit
83575e347a
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue