[vlc-commits] timer: do not use vlc_cancel()
Rémi Denis-Courmont
git at videolan.org
Mon Feb 10 19:04:13 CET 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Feb 9 14:17:19 2020 +0200| [93b89a2181a6d76663db5dd81a04800282af126f] | committer: Rémi Denis-Courmont
timer: do not use vlc_cancel()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=93b89a2181a6d76663db5dd81a04800282af126f
---
src/posix/timer.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/src/posix/timer.c b/src/posix/timer.c
index 9acd51db8f..713a9133f5 100644
--- a/src/posix/timer.c
+++ b/src/posix/timer.c
@@ -23,7 +23,6 @@
#endif
#include <stdatomic.h>
-#include <stdnoreturn.h>
#include <stdlib.h>
#include <errno.h>
#include <assert.h>
@@ -47,22 +46,23 @@ struct vlc_timer
void (*func) (void *);
void *data;
vlc_tick_t value, interval;
+ bool live;
atomic_uint overruns;
};
-noreturn static void *vlc_timer_thread (void *data)
+static void *vlc_timer_thread (void *data)
{
struct vlc_timer *timer = data;
vlc_mutex_lock (&timer->lock);
- mutex_cleanup_push (&timer->lock);
- for (;;)
+ while (timer->live)
{
- while (timer->value == 0)
+ if (timer->value == 0)
{
assert(timer->interval == 0);
vlc_cond_wait (&timer->reschedule, &timer->lock);
+ continue;
}
if (timer->interval != 0)
@@ -94,16 +94,12 @@ noreturn static void *vlc_timer_thread (void *data)
}
vlc_mutex_unlock (&timer->lock);
-
- int canc = vlc_savecancel ();
timer->func (timer->data);
- vlc_restorecancel (canc);
-
vlc_mutex_lock (&timer->lock);
}
- vlc_cleanup_pop ();
- vlc_assert_unreachable ();
+ vlc_mutex_unlock (&timer->lock);
+ return NULL;
}
int vlc_timer_create (vlc_timer_t *id, void (*func) (void *), void *data)
@@ -119,6 +115,7 @@ int vlc_timer_create (vlc_timer_t *id, void (*func) (void *), void *data)
timer->data = data;
timer->value = 0;
timer->interval = 0;
+ timer->live = true;
atomic_init(&timer->overruns, 0);
if (vlc_clone (&timer->thread, vlc_timer_thread, timer,
@@ -136,7 +133,11 @@ int vlc_timer_create (vlc_timer_t *id, void (*func) (void *), void *data)
void vlc_timer_destroy (vlc_timer_t timer)
{
- vlc_cancel (timer->thread);
+ vlc_mutex_lock(&timer->lock);
+ timer->live = false;
+ vlc_cond_signal(&timer->reschedule);
+ vlc_mutex_unlock(&timer->lock);
+
vlc_join (timer->thread, NULL);
vlc_cond_destroy (&timer->reschedule);
vlc_mutex_destroy (&timer->lock);
More information about the vlc-commits
mailing list