vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Feb 9 14:32:59 2020 +0200| [68ed45eb1152d05892b9e181b2ea69b783b9e36f] | committer: Rémi Denis-Courmont
sap: use vlc_list for SAP sessions > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=68ed45eb1152d05892b9e181b2ea69b783b9e36f --- src/stream_output/sap.c | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/src/stream_output/sap.c b/src/stream_output/sap.c index 09c8f9e469..8c5413fb17 100644 --- a/src/stream_output/sap.c +++ b/src/stream_output/sap.c @@ -43,10 +43,13 @@ /* SAP is always on that port */ #define IPPORT_SAP 9875 +struct sap_address_t; + /* A SAP session descriptor, enqueued in the SAP handler queue */ struct session_descriptor_t { - struct session_descriptor_t *next; + struct vlc_list node; + struct sap_address_t *addr; size_t length; char *data; }; @@ -68,7 +71,7 @@ typedef struct sap_address_t unsigned interval; unsigned session_count; - session_descriptor_t *first; + struct vlc_list sessions; } sap_address_t; static struct vlc_list sap_addrs = VLC_LIST_INITIALIZER(&sap_addrs); @@ -102,7 +105,7 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group) vlc_mutex_init (&addr->lock); vlc_cond_init (&addr->wait); addr->session_count = 0; - addr->first = NULL; + vlc_list_init(&addr->sessions); if (vlc_clone (&addr->thread, RunThread, addr, VLC_THREAD_PRIORITY_LOW)) { @@ -116,7 +119,7 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group) static void AddressDestroy (sap_address_t *addr) { - assert (addr->first == NULL); + assert(vlc_list_is_empty(&addr->sessions)); vlc_cancel (addr->thread); vlc_join (addr->thread, NULL); @@ -143,13 +146,13 @@ noreturn static void *RunThread (void *self) session_descriptor_t *p_session; vlc_tick_t deadline; - while (addr->first == NULL) + while (vlc_list_is_empty(&addr->sessions)) vlc_cond_wait (&addr->wait, &addr->lock); assert (addr->session_count > 0); deadline = vlc_tick_now (); - for (p_session = addr->first; p_session; p_session = p_session->next) + vlc_list_foreach (p_session, &addr->sessions, node) { send (addr->fd, p_session->data, p_session->length, 0); deadline += vlc_tick_from_samples(addr->interval, addr->session_count); @@ -299,8 +302,6 @@ matched: if (unlikely(session == NULL)) goto out; /* NOTE: we should destroy the thread if left unused */ - session->next = sap_addr->first; - /* Build the SAP Headers */ struct vlc_memstream stream; vlc_memstream_open(&stream); @@ -350,9 +351,10 @@ matched: goto out; } + session->addr = sap_addr; session->data = stream.ptr; session->length = stream.length; - sap_addr->first = session; + vlc_list_append(&session->node, &sap_addr->sessions); sap_addr->session_count++; vlc_cond_signal (&sap_addr->wait); out: @@ -369,36 +371,19 @@ out: */ void sout_AnnounceUnRegister (vlc_object_t *obj, session_descriptor_t *session) { - sap_address_t *addr; - session_descriptor_t **psession = NULL; + sap_address_t *addr = session->addr; msg_Dbg (obj, "removing SAP session"); vlc_mutex_lock (&sap_mutex); + vlc_mutex_lock(&addr->lock); + vlc_list_remove(&session->node); - vlc_list_foreach (addr, &sap_addrs, node) - { - psession = &addr->first; - vlc_mutex_lock (&addr->lock); - while (*psession != NULL) - { - if (*psession == session) - goto found; - psession = &(*psession)->next; - } - vlc_mutex_unlock (&addr->lock); - } - - vlc_assert_unreachable(); - -found: - *psession = session->next; - - if (addr->first == NULL) + 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 (addr->first == NULL) + if (vlc_list_is_empty(&addr->sessions)) { /* Last session for this address -> unlink the address */ vlc_mutex_unlock (&addr->lock); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
