From b599d3c836c7a5c4c665339279a47da8be914789 Mon Sep 17 00:00:00 2001 From: Maarten Bosmans Date: Tue, 15 Mar 2011 21:06:46 +0100 Subject: Fix pa_rtclock_from_wallclock The HAVE_CLOCK_GETTIME macro protects timespec and related functions, nothing of which is used in pa_rtclock_from_wallclock. And silently just not converting was not the proper solution anyway. Also add an assert in pulse/mainloop.c to report the integer overflow that was triggered by the wrong pa_rtclock_from_wallclock. Without the assert, debugging was painful. --- src/pulse/mainloop.c | 23 ++++++++++++++--------- src/pulsecore/core-rtclock.c | 14 ++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c index 8c261381..f02d31a1 100644 --- a/src/pulse/mainloop.c +++ b/src/pulse/mainloop.c @@ -151,7 +151,7 @@ static pa_io_event_flags_t map_flags_from_libc(short flags) { /* IO events */ static pa_io_event* mainloop_io_new( - pa_mainloop_api*a, + pa_mainloop_api *a, int fd, pa_io_event_flags_t events, pa_io_event_cb_t callback, @@ -244,7 +244,7 @@ static void mainloop_io_set_destroy(pa_io_event *e, pa_io_event_destroy_cb_t cal /* Defer events */ static pa_defer_event* mainloop_defer_new( - pa_mainloop_api*a, + pa_mainloop_api *a, pa_defer_event_cb_t callback, void *userdata) { @@ -331,7 +331,7 @@ static pa_usec_t make_rt(const struct timeval *tv, pa_bool_t *use_rtclock) { } static pa_time_event* mainloop_time_new( - pa_mainloop_api*a, + pa_mainloop_api *a, const struct timeval *tv, pa_time_event_cb_t callback, void *userdata) { @@ -355,7 +355,7 @@ static pa_time_event* mainloop_time_new( if ((e->enabled = (t != PA_USEC_INVALID))) { e->time = t; - e->use_rtclock= use_rtclock; + e->use_rtclock = use_rtclock; m->n_enabled_time_events++; @@ -438,7 +438,7 @@ static void mainloop_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb /* quit() */ -static void mainloop_quit(pa_mainloop_api*a, int retval) { +static void mainloop_quit(pa_mainloop_api *a, int retval) { pa_mainloop *m; pa_assert(a); @@ -591,7 +591,7 @@ static void cleanup_defer_events(pa_mainloop *m, pa_bool_t force) { } -void pa_mainloop_free(pa_mainloop* m) { +void pa_mainloop_free(pa_mainloop *m) { pa_assert(m); cleanup_io_events(m, TRUE); @@ -848,10 +848,15 @@ quit: } static int usec_to_timeout(pa_usec_t u) { + int timeout; + if (u == PA_USEC_INVALID) return -1; - return (u + PA_USEC_PER_MSEC - 1) / PA_USEC_PER_MSEC; + timeout = (u + PA_USEC_PER_MSEC - 1) / PA_USEC_PER_MSEC; + pa_assert(timeout >= 0); + + return timeout; } int pa_mainloop_poll(pa_mainloop *m) { @@ -988,7 +993,7 @@ void pa_mainloop_quit(pa_mainloop *m, int retval) { pa_mainloop_wakeup(m); } -pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m) { +pa_mainloop_api* pa_mainloop_get_api(pa_mainloop *m) { pa_assert(m); return &m->api; @@ -1001,7 +1006,7 @@ void pa_mainloop_set_poll_func(pa_mainloop *m, pa_poll_func poll_func, void *use m->poll_func_userdata = userdata; } -pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m) { +pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api *m) { pa_assert(m); return m->io_new == mainloop_io_new; diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c index ac2c097a..331ac112 100644 --- a/src/pulsecore/core-rtclock.c +++ b/src/pulsecore/core-rtclock.c @@ -182,15 +182,13 @@ void pa_rtclock_hrtimer_enable(void) { } struct timeval* pa_rtclock_from_wallclock(struct timeval *tv) { - -#ifdef HAVE_CLOCK_GETTIME struct timeval wc_now, rt_now; + pa_assert(tv); + pa_gettimeofday(&wc_now); pa_rtclock_get(&rt_now); - pa_assert(tv); - /* pa_timeval_sub() saturates on underflow! */ if (pa_timeval_cmp(&wc_now, tv) < 0) @@ -199,7 +197,6 @@ struct timeval* pa_rtclock_from_wallclock(struct timeval *tv) { pa_timeval_sub(&rt_now, pa_timeval_diff(&wc_now, tv)); *tv = rt_now; -#endif return tv; } @@ -232,15 +229,13 @@ struct timespec* pa_timespec_store(struct timespec *ts, pa_usec_t v) { #endif static struct timeval* wallclock_from_rtclock(struct timeval *tv) { - -#ifdef HAVE_CLOCK_GETTIME struct timeval wc_now, rt_now; + pa_assert(tv); + pa_gettimeofday(&wc_now); pa_rtclock_get(&rt_now); - pa_assert(tv); - /* pa_timeval_sub() saturates on underflow! */ if (pa_timeval_cmp(&rt_now, tv) < 0) @@ -249,7 +244,6 @@ static struct timeval* wallclock_from_rtclock(struct timeval *tv) { pa_timeval_sub(&wc_now, pa_timeval_diff(&rt_now, tv)); *tv = wc_now; -#endif return tv; } -- cgit