From 5d561e1e2dcde3c9fca4d925f12447009d0d4a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Wed, 18 Apr 2018 17:23:57 +0300 Subject: [PATCH] posix: remove ancient run-time fallback to real-time clock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit posix: remove ancient run-time fallback to real-time clock For hysterical raisins, GNU/Linux and possibly some other OSes still report that monotonic clock must be checked at run-time, although I doubt that VLC or even current glibc would run on such old kernel. Drop that to simplify and avoid the systematic one-time init check. Downloaded from upstream commit to fix build error on m68k: posix/thread.c:79:5: warning: #warning Monotonic clock not available. Expect timing issues. [-Wcpp] # warning Monotonic clock not available. Expect timing issues. ^~~~~~~ posix/thread.c: In function ‘vlc_clock_setup_once’: posix/thread.c:88:18: error: lvalue required as left operand of assignment vlc_clock_id = (val < 0) ? CLOCK_REALTIME : CLOCK_MONOTONIC; Signed-off-by: Bernd Kuhls --- src/posix/thread.c | 96 +++++++----------------------------------------------- 1 file changed, 11 insertions(+), 85 deletions(-) diff --git a/src/posix/thread.c b/src/posix/thread.c index dab8b71f97..8878941913 100644 --- a/src/posix/thread.c +++ b/src/posix/thread.c @@ -51,62 +51,16 @@ # include #endif -#if !defined (_POSIX_TIMERS) -# define _POSIX_TIMERS (-1) -#endif -#if !defined (_POSIX_CLOCK_SELECTION) -/* Clock selection was defined in 2001 and became mandatory in 2008. */ -# define _POSIX_CLOCK_SELECTION (-1) -#endif -#if !defined (_POSIX_MONOTONIC_CLOCK) -# define _POSIX_MONOTONIC_CLOCK (-1) -#endif - -#if (_POSIX_TIMERS > 0) static unsigned vlc_clock_prec; -# if (_POSIX_MONOTONIC_CLOCK > 0) && (_POSIX_CLOCK_SELECTION > 0) -/* Compile-time POSIX monotonic clock support */ -# define vlc_clock_id (CLOCK_MONOTONIC) - -# elif (_POSIX_MONOTONIC_CLOCK == 0) && (_POSIX_CLOCK_SELECTION > 0) -/* Run-time POSIX monotonic clock support (see clock_setup() below) */ -static clockid_t vlc_clock_id; - -# else -/* No POSIX monotonic clock support */ -# define vlc_clock_id (CLOCK_REALTIME) -# warning Monotonic clock not available. Expect timing issues. - -# endif /* _POSIX_MONOTONIC_CLOKC */ - static void vlc_clock_setup_once (void) { -# if (_POSIX_MONOTONIC_CLOCK == 0) - long val = sysconf (_SC_MONOTONIC_CLOCK); - assert (val != 0); - vlc_clock_id = (val < 0) ? CLOCK_REALTIME : CLOCK_MONOTONIC; -# endif - struct timespec res; - if (unlikely(clock_getres (vlc_clock_id, &res) != 0 || res.tv_sec != 0)) + if (unlikely(clock_getres(CLOCK_MONOTONIC, &res) != 0 || res.tv_sec != 0)) abort (); vlc_clock_prec = (res.tv_nsec + 500) / 1000; } -static pthread_once_t vlc_clock_once = PTHREAD_ONCE_INIT; - -# define vlc_clock_setup() \ - pthread_once(&vlc_clock_once, vlc_clock_setup_once) - -#else /* _POSIX_TIMERS */ - -# include /* gettimeofday() */ - -# 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) { lldiv_t d = lldiv (date, CLOCK_FREQ); @@ -233,14 +187,11 @@ void vlc_cond_init (vlc_cond_t *p_condvar) { pthread_condattr_t attr; - if (unlikely(pthread_condattr_init (&attr))) - abort (); -#if (_POSIX_CLOCK_SELECTION > 0) - vlc_clock_setup (); - pthread_condattr_setclock (&attr, vlc_clock_id); -#endif - if (unlikely(pthread_cond_init (p_condvar, &attr))) + if (unlikely(pthread_condattr_init (&attr)) + || unlikely(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) + || unlikely(pthread_cond_init (p_condvar, &attr))) abort (); + pthread_condattr_destroy (&attr); } @@ -625,44 +576,27 @@ void vlc_control_cancel (int cmd, ...) mtime_t mdate (void) { -#if (_POSIX_TIMERS > 0) struct timespec ts; - vlc_clock_setup (); - if (unlikely(clock_gettime (vlc_clock_id, &ts) != 0)) + if (unlikely(clock_gettime(CLOCK_MONOTONIC, &ts) != 0)) abort (); return (INT64_C(1000000) * ts.tv_sec) + (ts.tv_nsec / 1000); - -#else - struct timeval tv; - - if (unlikely(gettimeofday (&tv, NULL) != 0)) - abort (); - return (INT64_C(1000000) * tv.tv_sec) + tv.tv_usec; - -#endif } #undef mwait void mwait (mtime_t deadline) { -#if (_POSIX_CLOCK_SELECTION > 0) - vlc_clock_setup (); + static pthread_once_t vlc_clock_once = PTHREAD_ONCE_INIT; + /* If the deadline is already elapsed, or within the clock precision, * do not even bother the system timer. */ + pthread_once(&vlc_clock_once, vlc_clock_setup_once); deadline -= vlc_clock_prec; struct timespec ts = mtime_to_ts (deadline); - while (clock_nanosleep (vlc_clock_id, TIMER_ABSTIME, &ts, NULL) == EINTR); - -#else - deadline -= mdate (); - if (deadline > 0) - msleep (deadline); - -#endif + while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL) == EINTR); } #undef msleep @@ -670,15 +604,7 @@ void msleep (mtime_t delay) { struct timespec ts = mtime_to_ts (delay); -#if (_POSIX_CLOCK_SELECTION > 0) - vlc_clock_setup (); - while (clock_nanosleep (vlc_clock_id, 0, &ts, &ts) == EINTR); - -#else - while (nanosleep (&ts, &ts) == -1) - assert (errno == EINTR); - -#endif + while (clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, &ts) == EINTR); } unsigned vlc_GetCPUCount(void) -- 2.14.4