vlc | branch: master | Pierre d'Herbemont <[email protected]> | Sun Aug 1 17:15:10 2010 +0200| [6dc4e2605312381b4e8dd5eb4d8463075037dce0] | committer: Pierre d'Herbemont
pthread: Use pthread_cond_timedwait_relative_np() on Darwin. Switching to the non monotonic clock was still unsafe. This fixes some sync issues on the iPad. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6dc4e2605312381b4e8dd5eb4d8463075037dce0 --- src/misc/pthread.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/misc/pthread.c b/src/misc/pthread.c index 5385d7c..ebbad78 100644 --- a/src/misc/pthread.c +++ b/src/misc/pthread.c @@ -380,22 +380,28 @@ int vlc_cond_timedwait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex, mtime_t deadline) { #if defined(__APPLE__) && !defined(__powerpc__) && !defined( __ppc__ ) && !defined( __ppc64__ ) - /* mdate() is mac_absolute_time on OSX, which we must convert to do - * the same base than gettimeofday() which pthread_cond_timedwait - * relies on. */ - mtime_t oldbase = mdate(); - struct timeval tv; - gettimeofday(&tv, NULL); - mtime_t newbase = (mtime_t)tv.tv_sec * 1000000 + (mtime_t) tv.tv_usec; - deadline = deadline - oldbase + newbase; -#endif + /* mdate() is the monotonic clock, timedwait origin is gettimeofday() which + * isn't monotonic. Use imedwait_relative_np() instead + */ + mtime_t base = mdate(); + deadline -= base; + if (deadline < 0) + deadline = 0; lldiv_t d = lldiv( deadline, CLOCK_FREQ ); struct timespec ts = { d.quot, d.rem * (1000000000 / CLOCK_FREQ) }; + int val = pthread_cond_timedwait_relative_np(p_condvar, p_mutex, &ts); + if (val != ETIMEDOUT) + VLC_THREAD_ASSERT ("timed-waiting on condition"); + return val; +#else + lldiv_t d = lldiv( deadline, CLOCK_FREQ ); + struct timespec ts = { d.quot, d.rem * (1000000000 / CLOCK_FREQ) }; int val = pthread_cond_timedwait (p_condvar, p_mutex, &ts); if (val != ETIMEDOUT) VLC_THREAD_ASSERT ("timed-waiting on condition"); return val; +#endif } /** _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
