[vlc-devel] [PATCH 4/5] sap: create the thread after the first session is ready

RĂ©mi Denis-Courmont remi at remlab.net
Sun Feb 9 14:33:12 CET 2020


This ensures that the thread will not be leaked doing nothing if
session creation fails.
---
 src/stream_output/sap.c | 43 +++++++++++++++++++++--------------------
 1 file changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/stream_output/sap.c b/src/stream_output/sap.c
index ca5a2f22c6..eb85ab7297 100644
--- a/src/stream_output/sap.c
+++ b/src/stream_output/sap.c
@@ -105,23 +105,11 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group)
     vlc_cond_init (&addr->wait);
     addr->session_count = 0;
     vlc_list_init(&addr->sessions);
-
-    if (vlc_clone (&addr->thread, RunThread, addr, VLC_THREAD_PRIORITY_LOW))
-    {
-        msg_Err (obj, "unable to spawn SAP announce thread");
-        net_Close (fd);
-        free (addr);
-        return NULL;
-    }
     return addr;
 }
 
 static void AddressDestroy (sap_address_t *addr)
 {
-    assert(vlc_list_is_empty(&addr->sessions));
-
-    vlc_cancel (addr->thread);
-    vlc_join (addr->thread, NULL);
     vlc_cond_destroy (&addr->wait);
     net_Close (addr->fd);
     free (addr);
@@ -142,14 +130,10 @@ noreturn static void *RunThread (void *self)
     for (;;)
     {
         session_descriptor_t *p_session;
-        vlc_tick_t deadline;
-
-        while (vlc_list_is_empty(&addr->sessions))
-            vlc_cond_wait(&addr->wait, &sap_mutex);
+        vlc_tick_t deadline = vlc_tick_now();
 
         assert (addr->session_count > 0);
 
-        deadline = vlc_tick_now ();
         vlc_list_foreach (p_session, &addr->sessions, node)
         {
             send (addr->fd, p_session->data, p_session->length, 0);
@@ -349,8 +333,22 @@ matched:
     session->data = stream.ptr;
     session->length = stream.length;
     vlc_list_append(&session->node, &sap_addr->sessions);
-    sap_addr->session_count++;
-    vlc_cond_signal (&sap_addr->wait);
+
+    if (sap_addr->session_count++ == 0)
+    {
+        if (vlc_clone(&sap_addr->thread, RunThread, sap_addr,
+                      VLC_THREAD_PRIORITY_LOW))
+        {
+            msg_Err(obj, "unable to spawn SAP announce thread");
+            AddressDestroy(sap_addr);
+            free(session->data);
+            free(session);
+            session = NULL;
+            goto out;
+        }
+    }
+    else
+        vlc_cond_signal(&sap_addr->wait);
 out:
     vlc_mutex_unlock(&sap_mutex);
     return session;
@@ -383,8 +381,11 @@ void sout_AnnounceUnRegister (vlc_object_t *obj, session_descriptor_t *session)
     vlc_mutex_unlock (&sap_mutex);
 
     if (vlc_list_is_empty(&addr->sessions))
-        /* Last session for this address -> unlink the address */
-        AddressDestroy (addr);
+    {
+        vlc_cancel(addr->thread);
+        vlc_join(addr->thread, NULL);
+        AddressDestroy(addr);
+    }
 
     free(session->data);
     free(session);
-- 
2.25.0



More information about the vlc-devel mailing list