[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