[vlc-devel] [PATCH 2/2] audioscrobbler: use semaphore instead of cancellation

RĂ©mi Denis-Courmont remi at remlab.net
Sun Apr 12 11:14:41 CEST 2020


---
 modules/misc/audioscrobbler.c | 26 +++++++++++++++++---------
 1 file changed, 17 insertions(+), 9 deletions(-)

diff --git a/modules/misc/audioscrobbler.c b/modules/misc/audioscrobbler.c
index 312c271fd0..741a5524c3 100644
--- a/modules/misc/audioscrobbler.c
+++ b/modules/misc/audioscrobbler.c
@@ -82,6 +82,7 @@ struct intf_sys_t
 
     vlc_mutex_t             lock;               /**< p_sys mutex            */
     vlc_cond_t              wait;               /**< song to submit event   */
+    vlc_sem_t               dead;
     vlc_thread_t            thread;             /**< thread to submit song  */
 
     /* submission of played songs */
@@ -406,6 +407,7 @@ static int Open(vlc_object_t *p_this)
 
     vlc_mutex_init(&p_sys->lock);
     vlc_cond_init(&p_sys->wait);
+    vlc_sem_init(&p_sys->dead, 0);
 
     if (vlc_clone(&p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW))
     {
@@ -438,7 +440,10 @@ static void Close(vlc_object_t *p_this)
     intf_sys_t *p_sys = p_intf->p_sys;
     vlc_playlist_t *playlist = p_sys->playlist;
 
-    vlc_cancel(p_sys->thread);
+    vlc_mutex_lock(&p_sys->lock);
+    vlc_sem_post(&p_sys->dead);
+    vlc_cond_signal(&p_sys->wait);
+    vlc_mutex_unlock(&p_sys->lock);
     vlc_join(p_sys->thread, NULL);
 
     int i;
@@ -681,7 +686,6 @@ static void *Run(void *data)
 {
     intf_thread_t          *p_intf = data;
     uint8_t                 p_buffer[1024];
-    int                     canc = vlc_savecancel();
     bool                    b_handshaked = false;
     bool                    b_nowp_submission_ongoing = false;
 
@@ -694,19 +698,24 @@ static void *Run(void *data)
     /* main loop */
     for (;;)
     {
-        vlc_restorecancel(canc);
-        if (next_exchange != VLC_TICK_INVALID)
-            vlc_tick_wait(next_exchange);
+        if (next_exchange != VLC_TICK_INVALID
+         && vlc_sem_timedwait(&p_sys->dead, next_exchange) == 0)
+            break;
 
         vlc_mutex_lock(&p_sys->lock);
-        mutex_cleanup_push(&p_sys->lock);
 
         while (p_sys->i_songs == 0 && p_sys->b_submit_nowp == false)
+        {
+            if (vlc_sem_trywait(&p_sys->dead) == 0)
+            {
+                vlc_mutex_unlock(&p_sys->lock);
+                break;
+            }
+
             vlc_cond_wait(&p_sys->wait, &p_sys->lock);
+        }
 
-        vlc_cleanup_pop();
         vlc_mutex_unlock(&p_sys->lock);
-        canc = vlc_savecancel();
 
         /* handshake if needed */
         if (!b_handshaked)
@@ -911,6 +920,5 @@ static void *Run(void *data)
         }
     }
 out:
-    vlc_restorecancel(canc);
     return NULL;
 }
-- 
2.26.0



More information about the vlc-devel mailing list