summaryrefslogtreecommitdiffstats
path: root/src/pulse
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2009-06-20 16:52:41 +0300
committerMarc-André Lureau <marcandre.lureau@gmail.com>2009-06-20 17:29:34 +0300
commite4d914c945c13d23b131d7ba75fbdd03cb6d0043 (patch)
tree19b10b6376a2f28b570d95771363449037f8bfa8 /src/pulse
parent0955e3d45b6e992308e2d51fcbf28a9f9376f788 (diff)
rtclock: fix issues found by Lennart
Diffstat (limited to 'src/pulse')
-rw-r--r--src/pulse/context.c14
-rw-r--r--src/pulse/mainloop.c20
2 files changed, 22 insertions, 12 deletions
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 0c1810f3..b71659de 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -54,6 +54,8 @@
#include <pulse/utf8.h>
#include <pulse/util.h>
#include <pulse/i18n.h>
+#include <pulse/mainloop.h>
+#include <pulse/timeval.h>
#include <pulsecore/winsock.h>
#include <pulsecore/core-error.h>
@@ -1451,6 +1453,9 @@ pa_time_event* pa_context_rttime_new(pa_context *c, pa_usec_t usec, pa_time_even
pa_assert(c);
pa_assert(c->mainloop);
+ if (usec == PA_USEC_INVALID)
+ return c->mainloop->time_new(c->mainloop, NULL, cb, userdata);
+
pa_timeval_rtstore(&tv, usec, c->use_rtclock);
return c->mainloop->time_new(c->mainloop, &tv, cb, userdata);
@@ -1462,7 +1467,10 @@ void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec)
pa_assert(c);
pa_assert(c->mainloop);
- pa_timeval_rtstore(&tv, usec, c->use_rtclock);
-
- c->mainloop->time_restart(e, &tv);
+ if (usec == PA_USEC_INVALID)
+ c->mainloop->time_restart(e, NULL);
+ else {
+ pa_timeval_rtstore(&tv, usec, c->use_rtclock);
+ c->mainloop->time_restart(e, &tv);
+ }
}
diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index 1b779468..5d0e0ffc 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -319,19 +319,21 @@ static void mainloop_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy
}
/* Time events */
-static pa_usec_t timeval_load(struct timeval *tv) {
+static pa_usec_t timeval_load(const struct timeval *tv) {
pa_bool_t is_rtclock;
+ struct timeval ttv;
if (!tv)
return PA_USEC_INVALID;
- is_rtclock = !!(tv->tv_usec & PA_TIMEVAL_RTCLOCK);
- tv->tv_usec &= ~PA_TIMEVAL_RTCLOCK;
+ ttv = *tv;
+ is_rtclock = !!(ttv.tv_usec & PA_TIMEVAL_RTCLOCK);
+ ttv.tv_usec &= ~PA_TIMEVAL_RTCLOCK;
if (!is_rtclock)
- pa_rtclock_from_wallclock(tv);
+ pa_rtclock_from_wallclock(&ttv);
- return pa_timeval_load(tv);
+ return pa_timeval_load(&ttv);
}
static pa_time_event* mainloop_time_new(
@@ -343,13 +345,13 @@ static pa_time_event* mainloop_time_new(
pa_mainloop *m;
pa_time_event *e;
pa_usec_t t;
- struct timeval ttv;
pa_assert(a);
pa_assert(a->userdata);
pa_assert(callback);
- t = timeval_load(tv? ttv = *tv, &ttv : NULL);
+ t = timeval_load(tv);
+
m = a->userdata;
pa_assert(a == &m->api);
@@ -385,12 +387,12 @@ static pa_time_event* mainloop_time_new(
static void mainloop_time_restart(pa_time_event *e, const struct timeval *tv) {
pa_bool_t valid;
pa_usec_t t;
- struct timeval ttv;
pa_assert(e);
pa_assert(!e->dead);
- t = timeval_load(tv? ttv = *tv, &ttv : NULL);
+ t = timeval_load(tv);
+
valid = (t != PA_USEC_INVALID);
if (e->enabled && !valid) {
pa_assert(e->mainloop->n_enabled_time_events > 0);