[vlc-devel] [PATCH v2 9/9] android: fix monotonic cond_timedwait on newer versions
Thomas Guillem
tom at gllm.fr
Thu Oct 9 18:45:27 CEST 2014
android-L drops support for pthread_cond_timedwait_monotonic_np and adds
support for pthread_condattr_setclock. So, use the good function depending on
configure detection.
---
configure.ac | 2 +-
src/android/thread.c | 21 ++++++++++++++++++++-
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 1958a8f..3171ad5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -541,7 +541,7 @@ need_libc=false
dnl Check for usual libc functions
AC_CHECK_DECLS([nanosleep],,,[#include <time.h>])
-AC_CHECK_FUNCS([daemon fcntl fstatvfs fork getenv getpwuid_r isatty lstat memalign mmap openat pread posix_fadvise posix_madvise setlocale stricmp strnicmp strptime uselocale])
+AC_CHECK_FUNCS([daemon fcntl fstatvfs fork getenv getpwuid_r isatty lstat memalign mmap openat pread posix_fadvise posix_madvise setlocale stricmp strnicmp strptime uselocale pthread_cond_timedwait_monotonic_np pthread_condattr_setclock])
AC_REPLACE_FUNCS([atof atoll dirfd fdopendir flockfile fsync getdelim getpid gmtime_r lldiv localtime_r nrand48 poll posix_memalign rewind setenv strcasecmp strcasestr strdup strlcpy strndup strnlen strsep strtof strtok_r strtoll swab tdestroy strverscmp])
AC_CHECK_FUNCS(fdatasync,,
[AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.])
diff --git a/src/android/thread.c b/src/android/thread.c
index 1553073..5a6611e 100644
--- a/src/android/thread.c
+++ b/src/android/thread.c
@@ -185,8 +185,18 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc)
void vlc_cond_init (vlc_cond_t *condvar)
{
+#ifdef HAVE_PTHREAD_CONDATTR_SETCLOCK
+ pthread_condattr_t attr;
+
+ pthread_condattr_init (&attr);
+ pthread_condattr_setclock (&attr, CLOCK_MONOTONIC);
+
+ if (unlikely(pthread_cond_init (&condvar->cond, &attr)))
+ abort ();
+#else
if (unlikely(pthread_cond_init (&condvar->cond, NULL)))
abort ();
+#endif
condvar->clock = CLOCK_MONOTONIC;
}
@@ -257,7 +267,10 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
{
struct timespec ts = mtime_to_ts (deadline);
vlc_thread_t th = thread;
+ int val;
+#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP
int (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct timespec *);
+#endif
if (th != NULL)
{
@@ -277,6 +290,7 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
}
}
+#if defined (HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP)
switch (condvar->clock)
{
case CLOCK_REALTIME:
@@ -288,8 +302,13 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
default:
assert (0);
}
+ val = cb (&condvar->cond, p_mutex, &ts);
+#elif defined (HAVE_PTHREAD_CONDATTR_SETCLOCK)
+ val = pthread_cond_timedwait(&condvar->cond, p_mutex, &ts);
+#else
+ assert (0);
+#endif
- int val = cb (&condvar->cond, p_mutex, &ts);
if (val != ETIMEDOUT)
VLC_THREAD_ASSERT ("timed-waiting on condition");
--
2.1.0
More information about the vlc-devel
mailing list