summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2008-04-14 18:43:59 +0000
committerLennart Poettering <lennart@poettering.net>2008-04-14 18:43:59 +0000
commit6946d2ad2d905870bcbf98defc22c34ab6f21bd6 (patch)
tree61634363fa96504618d09c384e8474f6b13a5954
parent04178d428e5f687849e00d8a38ba206003fdcfed (diff)
make sure to clear all queued RT signals before arm a new timer
git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/glitch-free@2265 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r--src/pulsecore/rtpoll.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c
index afcd7e5d..bd1c43ad 100644
--- a/src/pulsecore/rtpoll.c
+++ b/src/pulsecore/rtpoll.c
@@ -462,9 +462,22 @@ static void update_timer(pa_rtpoll *p) {
if (p->timer != (timer_t) -1) {
struct itimerspec its;
+ struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 };
+ sigset_t ss;
+
+ /* First disarm timer */
memset(&its, 0, sizeof(its));
+ pa_assert_se(timer_settime(p->timer, TIMER_ABSTIME, &its, NULL) == 0);
+
+ /* Remove a signal that might be waiting in the signal q */
+ pa_assert_se(sigemptyset(&ss) == 0);
+ pa_assert_se(sigaddset(&ss, p->rtsig) == 0);
+ sigtimedwait(&ss, NULL, &ts);
+ /* And install the new timer */
if (p->timer_enabled) {
+ memset(&its, 0, sizeof(its));
+
its.it_value.tv_sec = p->next_elapse.tv_sec;
its.it_value.tv_nsec = p->next_elapse.tv_usec*1000;
@@ -472,9 +485,8 @@ static void update_timer(pa_rtpoll *p) {
* "disarming" */
if (its.it_value.tv_sec == 0 && its.it_value.tv_nsec == 0)
its.it_value.tv_nsec = 1;
+ pa_assert_se(timer_settime(p->timer, TIMER_ABSTIME, &its, NULL) == 0);
}
-
- pa_assert_se(timer_settime(p->timer, TIMER_ABSTIME, &its, NULL) == 0);
}
#ifdef __linux__