[vlc-commits] puzzle: use atomic variables and flag instead of lock

Rémi Denis-Courmont git at videolan.org
Sat Nov 10 21:42:58 CET 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | 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;
 }



More information about the vlc-commits mailing list