[vlc-devel] [PATCH 3/5] sap: merge both locks
Steve Lhomme
robux4 at ycbcr.xyz
Mon Feb 10 07:54:55 CET 2020
I think you forgot to remove the lock field in struct sap_address_t.
On 2020-02-09 14:33, RĂ©mi Denis-Courmont wrote:
> 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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
>
More information about the vlc-devel
mailing list