188 lines
5.5 KiB
Diff
188 lines
5.5 KiB
Diff
|
From 5d561e1e2dcde3c9fca4d925f12447009d0d4a4c Mon Sep 17 00:00:00 2001
|
|||
|
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
|
|||
|
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 <bernd.kuhls@t-online.de>
|
|||
|
---
|
|||
|
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 <sys/pset.h>
|
|||
|
#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 <sys/time.h> /* 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
|
|||
|
|