[vlc-devel] [PATCH 3/5] sap: merge both locks
RĂ©mi Denis-Courmont
remi at remlab.net
Sun Feb 9 14:33:11 CET 2020
This is simpler and even necessary for the following fix.
---
src/stream_output/sap.c | 32 +++++++++++---------------------
1 file changed, 11 insertions(+), 21 deletions(-)
diff --git a/src/stream_output/sap.c b/src/stream_output/sap.c
index 8c5413fb17..ca5a2f22c6 100644
--- a/src/stream_output/sap.c
+++ b/src/stream_output/sap.c
@@ -102,7 +102,6 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group)
getsockname (fd, (struct sockaddr *)&addr->orig, &addr->origlen);
addr->interval = var_CreateGetInteger (obj, "sap-interval");
- vlc_mutex_init (&addr->lock);
vlc_cond_init (&addr->wait);
addr->session_count = 0;
vlc_list_init(&addr->sessions);
@@ -124,7 +123,6 @@ static void AddressDestroy (sap_address_t *addr)
vlc_cancel (addr->thread);
vlc_join (addr->thread, NULL);
vlc_cond_destroy (&addr->wait);
- vlc_mutex_destroy (&addr->lock);
net_Close (addr->fd);
free (addr);
}
@@ -138,8 +136,8 @@ noreturn static void *RunThread (void *self)
{
sap_address_t *addr = self;
- vlc_mutex_lock (&addr->lock);
- mutex_cleanup_push (&addr->lock);
+ vlc_mutex_lock(&sap_mutex);
+ mutex_cleanup_push(&sap_mutex);
for (;;)
{
@@ -147,7 +145,7 @@ noreturn static void *RunThread (void *self)
vlc_tick_t deadline;
while (vlc_list_is_empty(&addr->sessions))
- vlc_cond_wait (&addr->wait, &addr->lock);
+ vlc_cond_wait(&addr->wait, &sap_mutex);
assert (addr->session_count > 0);
@@ -157,7 +155,7 @@ noreturn static void *RunThread (void *self)
send (addr->fd, p_session->data, p_session->length, 0);
deadline += vlc_tick_from_samples(addr->interval, addr->session_count);
- if (vlc_cond_timedwait (&addr->wait, &addr->lock, deadline) == 0)
+ if (vlc_cond_timedwait(&addr->wait, &sap_mutex, deadline) == 0)
break; /* list may have changed! */
}
}
@@ -293,10 +291,6 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
}
matched:
vlc_list_append(&sap_addr->node, &sap_addrs);
- /* Switch locks.
- * NEVER take the global SAP lock when holding a SAP thread lock! */
- vlc_mutex_lock (&sap_addr->lock);
- vlc_mutex_unlock (&sap_mutex);
session_descriptor_t *session = malloc(sizeof (*session));
if (unlikely(session == NULL))
@@ -358,7 +352,7 @@ matched:
sap_addr->session_count++;
vlc_cond_signal (&sap_addr->wait);
out:
- vlc_mutex_unlock (&sap_addr->lock);
+ vlc_mutex_unlock(&sap_mutex);
return session;
}
@@ -375,27 +369,23 @@ void sout_AnnounceUnRegister (vlc_object_t *obj, session_descriptor_t *session)
msg_Dbg (obj, "removing SAP session");
vlc_mutex_lock (&sap_mutex);
- vlc_mutex_lock(&addr->lock);
vlc_list_remove(&session->node);
if (vlc_list_is_empty(&addr->sessions))
/* Last session for this address -> unlink the address */
vlc_list_remove(&addr->node);
- vlc_mutex_unlock (&sap_mutex);
-
- if (vlc_list_is_empty(&addr->sessions))
- {
- /* Last session for this address -> unlink the address */
- vlc_mutex_unlock (&addr->lock);
- AddressDestroy (addr);
- }
else
{
addr->session_count--;
vlc_cond_signal (&addr->wait);
- vlc_mutex_unlock (&addr->lock);
}
+ vlc_mutex_unlock (&sap_mutex);
+
+ if (vlc_list_is_empty(&addr->sessions))
+ /* Last session for this address -> unlink the address */
+ AddressDestroy (addr);
+
free(session->data);
free(session);
}
--
2.25.0
More information about the vlc-devel
mailing list