[vlc-commits] sout_select: fix race conditions.

Rémi Duraffort git at videolan.org
Wed Feb 16 00:24:24 CET 2011


vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Wed Feb 16 00:22:47 2011 +0100| [952df71de06b2a2f31b34cf44bc18f56ca8a835e] | committer: Rémi Duraffort

sout_select: fix race conditions.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=952df71de06b2a2f31b34cf44bc18f56ca8a835e
---

 modules/stream_out/select.c |   29 ++++++++++++++---------------
 1 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/modules/stream_out/select.c b/modules/stream_out/select.c
index efea525..93636b3 100644
--- a/modules/stream_out/select.c
+++ b/modules/stream_out/select.c
@@ -69,7 +69,7 @@ static sout_stream_id_t *Add   (sout_stream_t *, es_format_t *);
 static int               Del   (sout_stream_t *, sout_stream_id_t *);
 static int               Send  (sout_stream_t *, sout_stream_id_t *, block_t *);
 
-static void* Command(vlc_object_t *);
+static void* Command(void *);
 
 struct sout_stream_id_t
 {
@@ -85,6 +85,8 @@ struct sout_stream_sys_t
     int i_es_num;
 
     vlc_mutex_t es_lock;
+    vlc_thread_t thread;
+
     int i_fd;
     int i_id_disable;
 };
@@ -135,7 +137,7 @@ static int Open(vlc_object_t *p_this)
 
     vlc_mutex_init(&p_sys->es_lock);
 
-    if (vlc_thread_create(p_stream, Command, VLC_THREAD_PRIORITY_LOW))
+    if(vlc_clone(&p_sys->thread, Command, p_stream, VLC_THREAD_PRIORITY_LOW))
     {
         vlc_mutex_destroy(&p_sys->es_lock);
         free(p_sys);
@@ -156,11 +158,12 @@ static void Close (vlc_object_t * p_this)
     sout_stream_t     *p_stream = (sout_stream_t*)p_this;
     sout_stream_sys_t *p_sys = (sout_stream_sys_t *)p_stream->p_sys;
 
-    net_Close( p_sys->i_fd );
-    p_sys->i_fd = -1;
-
-    vlc_thread_join(p_stream);
+    /* Stop the thread */
+    vlc_cancel(p_sys->thread);
+    vlc_join(p_sys->thread, NULL);
 
+    /* Free the ressources */
+    net_Close( p_sys->i_fd );
     vlc_mutex_destroy(&p_sys->es_lock);
 
     p_stream->p_sout->i_out_pace_nocontrol--;
@@ -171,18 +174,13 @@ static void Close (vlc_object_t * p_this)
 /****************************************************************************
  * Command Thread:
  ****************************************************************************/
-static void* Command(vlc_object_t *p_this)
+static void* Command(void *p_this)
 {
     sout_stream_t *p_stream = (sout_stream_t *)p_this;
     sout_stream_sys_t *p_sys = p_stream->p_sys;
 
-    int canc = vlc_savecancel();
-
     while (vlc_object_alive(p_stream))
     {
-        if (p_sys->i_fd < 0)
-            break;
-
         char psz_buffer[20];
 
         int i_len = recv(p_sys->i_fd, psz_buffer, sizeof(psz_buffer)-1, 0);
@@ -195,6 +193,7 @@ static void* Command(vlc_object_t *p_this)
         if (strncmp(psz_buffer, "show", 4) == 0)
         {
             vlc_mutex_lock(&p_sys->es_lock);
+            mutex_cleanup_push(&p_sys->es_lock);
             for (int i = 0; i < p_sys->i_es_num; i++)
             {
                 i_len = snprintf(psz_buffer, sizeof(psz_buffer), "%.4s : %d",
@@ -203,7 +202,7 @@ static void* Command(vlc_object_t *p_this)
                 psz_buffer[i_len] = '\0';
                 msg_Info(p_stream, psz_buffer);
             }
-            vlc_mutex_unlock(&p_sys->es_lock);
+            vlc_cleanup_pop();
         }
         else
         {
@@ -226,6 +225,7 @@ static void* Command(vlc_object_t *p_this)
             if (b_apply)
             {
                 vlc_mutex_lock(&p_sys->es_lock);
+                mutex_cleanup_push(&p_sys->es_lock);
                 for (int i = 0; i < p_sys->i_es_num; i++)
                 {
                     msg_Info(p_stream, "elementary stream pid %d",
@@ -236,12 +236,11 @@ static void* Command(vlc_object_t *p_this)
                         msg_Info(p_stream, "%s: %d", b_select ? "enable" : "disable", i_pid);
                     }
                 }
-                vlc_mutex_unlock(&p_sys->es_lock);
+                vlc_cleanup_pop();
             }
         }
     }
 
-    vlc_restorecancel(canc);
     return NULL;
 }
 



More information about the vlc-commits mailing list