[vlc-commits] audioscrobbler: use semaphore instead of cancellation

Rémi Denis-Courmont git at videolan.org
Fri Apr 17 18:51:13 CEST 2020


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Apr 12 12:14:03 2020 +0300| [5bfde5eb6df35853f50cfaa4e26a7c38fe3e2c47] | committer: Rémi Denis-Courmont

audioscrobbler: use semaphore instead of cancellation

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5bfde5eb6df35853f50cfaa4e26a7c38fe3e2c47
---

 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 8b25dd17d4..c7da3f2775 100644
--- a/modules/misc/audioscrobbler.c
+++ b/modules/misc/audioscrobbler.c
@@ -83,6 +83,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 */
@@ -407,6 +408,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))
     {
@@ -439,7 +441,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;
@@ -667,7 +672,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;
 
@@ -680,19 +684,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)
@@ -897,6 +906,5 @@ static void *Run(void *data)
         }
     }
 out:
-    vlc_restorecancel(canc);
     return NULL;
 }



More information about the vlc-commits mailing list