vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sat Nov 10 22:42:07 2012 +0200| [689613d3c77657a2de5d741ff73b2cb66716d26d] | committer: Rémi Denis-Courmont
puzzle: use atomic variables and flag instead of lock > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=689613d3c77657a2de5d741ff73b2cb66716d26d --- modules/video_filter/puzzle.c | 57 +++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/modules/video_filter/puzzle.c b/modules/video_filter/puzzle.c index b9b6bf8..3e6f617 100644 --- a/modules/video_filter/puzzle.c +++ b/modules/video_filter/puzzle.c @@ -96,13 +96,12 @@ struct filter_sys_t bool b_finished; /* */ - vlc_mutex_t lock; - bool b_change; struct { - int i_cols; - int i_rows; - bool b_blackslot; + atomic_flag b_uptodate; + atomic_bool b_blackslot; + atomic_uint i_cols; + atomic_uint i_rows; } change; }; @@ -151,14 +150,13 @@ static int Open( vlc_object_t *p_this ) p_sys->pi_order = NULL; - vlc_mutex_init( &p_sys->lock ); - p_sys->change.i_rows = - var_CreateGetIntegerCommand( p_filter, CFG_PREFIX "rows" ); - p_sys->change.i_cols = - var_CreateGetIntegerCommand( p_filter, CFG_PREFIX "cols" ); - p_sys->change.b_blackslot = - var_CreateGetBoolCommand( p_filter, CFG_PREFIX "black-slot" ); - p_sys->b_change = true; + atomic_init( &p_sys->change.i_rows, + var_CreateGetIntegerCommand( p_filter, CFG_PREFIX "rows" ) ); + atomic_init( &p_sys->change.i_cols, + var_CreateGetIntegerCommand( p_filter, CFG_PREFIX "cols" ) ); + atomic_init( &p_sys->change.b_blackslot, + var_CreateGetBoolCommand( p_filter, CFG_PREFIX "black-slot" ) ); + p_sys->change.b_uptodate = ATOMIC_FLAG_INIT; var_AddCallback( p_filter, CFG_PREFIX "rows", PuzzleCallback, p_sys ); var_AddCallback( p_filter, CFG_PREFIX "cols", PuzzleCallback, p_sys ); @@ -182,7 +180,6 @@ static void Close( vlc_object_t *p_this ) var_DelCallback( p_filter, CFG_PREFIX "cols", PuzzleCallback, p_sys ); var_DelCallback( p_filter, CFG_PREFIX "black-slot", PuzzleCallback, p_sys ); - vlc_mutex_destroy( &p_sys->lock ); free( p_sys->pi_order ); free( p_sys ); @@ -203,17 +200,13 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic ) } /* */ - vlc_mutex_lock( &p_sys->lock ); - if( p_sys->b_change ) + if( !atomic_flag_test_and_set( &p_sys->change.b_uptodate ) ) { - p_sys->i_rows = p_sys->change.i_rows; - p_sys->i_cols = p_sys->change.i_cols; - p_sys->b_blackslot = p_sys->change.b_blackslot; - p_sys->b_change = false; - + p_sys->i_rows = atomic_load( &p_sys->change.i_rows ); + p_sys->i_cols = atomic_load( &p_sys->change.i_cols ); + p_sys->b_blackslot = atomic_load( &p_sys->change.b_blackslot ); Shuffle( p_sys ); } - vlc_mutex_unlock( &p_sys->lock ); /* */ const int i_rows = p_sys->i_rows; @@ -309,7 +302,7 @@ static int Mouse( filter_t *p_filter, vlc_mouse_t *p_mouse, if( b_clicked && p_new->i_x < SHUFFLE_WIDTH && p_new->i_y < SHUFFLE_HEIGHT ) { - p_sys->b_change = true; + atomic_flag_clear( &p_sys->change.b_uptodate ); return VLC_EGENERIC; } else @@ -359,23 +352,15 @@ static int PuzzleCallback( vlc_object_t *p_this, char const *psz_var, void *p_data ) { VLC_UNUSED(p_this); VLC_UNUSED(oldval); - filter_sys_t *p_sys = (filter_sys_t *)p_data; + filter_sys_t *p_sys = p_data; - vlc_mutex_lock( &p_sys->lock ); if( !strcmp( psz_var, CFG_PREFIX "rows" ) ) - { - p_sys->change.i_rows = __MAX( 1, newval.i_int ); - } + atomic_store( &p_sys->change.i_rows, __MAX( 1, newval.i_int ) ); else if( !strcmp( psz_var, CFG_PREFIX "cols" ) ) - { - p_sys->change.i_cols = __MAX( 1, newval.i_int ); - } + atomic_store( &p_sys->change.i_cols, __MAX( 1, newval.i_int ) ); else if( !strcmp( psz_var, CFG_PREFIX "black-slot" ) ) - { - p_sys->change.b_blackslot = newval.b_bool; - } - p_sys->b_change = true; - vlc_mutex_unlock( &p_sys->lock ); + atomic_store( &p_sys->change.b_blackslot, newval.b_bool ); + atomic_flag_clear( &p_sys->change.b_uptodate ); return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
