[vlc-commits] Fix vlc_cond_timedwait() without monotonic clock
Rémi Denis-Courmont
git at videolan.org
Thu Jul 14 19:44:46 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Jul 14 15:38:27 2011 +0300| [45c2bc0811cc2d9fe8e11448a05742d7ff6da1d8] | committer: Rémi Denis-Courmont
Fix vlc_cond_timedwait() without monotonic clock
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=45c2bc0811cc2d9fe8e11448a05742d7ff6da1d8
---
src/posix/thread.c | 52 ++++++++++++++++++++++------------------------------
1 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/src/posix/thread.c b/src/posix/thread.c
index 56b9d2d..966c74c 100644
--- a/src/posix/thread.c
+++ b/src/posix/thread.c
@@ -39,7 +39,10 @@
#include <errno.h>
#include <time.h>
+#include <pthread.h>
#include <sched.h>
+#include <sys/time.h> /* gettimeofday() */
+
#ifdef __linux__
# include <sys/syscall.h> /* SYS_gettid */
#endif
@@ -49,7 +52,6 @@
#endif
#ifdef __APPLE__
-# include <sys/time.h> /* gettimeofday in vlc_cond_timedwait */
# include <mach/mach_init.h> /* mach_task_self in semaphores */
# include <sys/sysctl.h>
#endif
@@ -81,32 +83,20 @@
#if (_POSIX_TIMERS > 0)
static unsigned vlc_clock_prec;
-# if (_POSIX_CLOCK_SELECTION > 0)
-/* POSIX clock selection is needed so that vlc_cond_timewait() is consistent
- * with mdate() and mwait(). Otherwise, the monotonic clock cannot be used.
- * Fortunately, clock selection has become mandatory as of 2008 so that really
- * only broken old systems still lack it. */
-
-# if (_POSIX_MONOTONIC_CLOCK > 0)
+# if (_POSIX_MONOTONIC_CLOCK > 0)
/* Compile-time POSIX monotonic clock support */
-# define vlc_clock_id (CLOCK_MONOTONIC)
+# define vlc_clock_id (CLOCK_MONOTONIC)
-# elif (_POSIX_MONOTONIC_CLOCK == 0)
+# elif (_POSIX_MONOTONIC_CLOCK == 0)
/* Run-time POSIX monotonic clock support (see clock_setup() below) */
static clockid_t vlc_clock_id;
-# else
+# else
/* No POSIX monotonic clock support */
# define vlc_clock_id (CLOCK_REALTIME)
# warning Monotonic clock not available. Expect timing issues.
-# endif /* _POSIX_MONOTONIC_CLOKC */
-# else
-/* No POSIX clock selection. */
-# define pthread_condattr_setclock(attr, clock) (attr, clock, 0)
-# warning Clock selection not available. Expect timing issues.
-
-# endif /* _POSIX_CLOCK_SELECTION */
+# endif /* _POSIX_MONOTONIC_CLOKC */
static void vlc_clock_setup_once (void)
{
@@ -135,6 +125,7 @@ int nanosleep (struct timespec *, struct timespec *);
# endif
# define vlc_clock_setup() (void)0
+# warning Monotonic clock not available. Expect timing issues.
#endif /* _POSIX_TIMERS */
static struct timespec mtime_to_ts (mtime_t date)
@@ -466,21 +457,22 @@ void vlc_cond_wait (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex)
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 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;
+#if (_POSIX_MONOTONIC_CLOCK > 0) && (_POSIX_CLOCK_SELECTION < 0)
+ /* Without clock selection, the real-time clock is used for the absolute
+ * timeout in pthread_cond_timedwait(). We may need to adjust. */
+# error FIXME: breaks vlc_cond_init_daytime()
+ if (vlc_clock_id != CLOCK_REALTIME)
+ {
+ struct timeval tv;
+
+ deadline -= mdate ();
+ gettimeofday (&tv, NULL);
+ deadline += tv.tv_sec * UINT64_C(1000000) + tv.tv_usec;
+ }
+#endif
- struct timespec ts = mtime_to_ts (deadline);
- int val = pthread_cond_timedwait_relative_np(p_condvar, p_mutex, &ts);
-#else
struct timespec ts = mtime_to_ts (deadline);
int val = pthread_cond_timedwait (p_condvar, p_mutex, &ts);
-#endif
if (val != ETIMEDOUT)
VLC_THREAD_ASSERT ("timed-waiting on condition");
return val;
More information about the vlc-commits
mailing list