]> git.sesse.net Git - vlc/commitdiff
android: fix monotonic cond_timedwait on newer versions
authorThomas Guillem <tom@gllm.fr>
Fri, 10 Oct 2014 07:45:57 +0000 (09:45 +0200)
committerJean-Baptiste Kempf <jb@videolan.org>
Mon, 13 Oct 2014 09:33:02 +0000 (11:33 +0200)
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.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
configure.ac
src/android/thread.c

index 921c5f7437ece809785d4a26c67cdf23f1454d80..a1810b2c060bf858c246a4e06f5b2bba4584aa78 100644 (file)
@@ -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.])
index 155307381b80275aa260f41b65bd3ba977dd2c56..dbf2ece9cb43be229949a8471cb4f234b8d7edce 100644 (file)
 #include <android/log.h>
 #include <sys/syscall.h> /* __NR_gettid */
 
+#if !defined(HAVE_PTHREAD_CONDATTR_SETCLOCK) && !defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP)
+#error no pthread monotonic clock support
+#endif
+
 /* helper */
 static struct timespec mtime_to_ts (mtime_t date)
 {
@@ -185,8 +189,18 @@ void vlc_threads_setup (libvlc_int_t *p_libvlc)
 
 void vlc_cond_init (vlc_cond_t *condvar)
 {
+#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP
     if (unlikely(pthread_cond_init (&condvar->cond, NULL)))
         abort ();
+#else
+    pthread_condattr_t attr;
+
+    pthread_condattr_init (&attr);
+    pthread_condattr_setclock (&attr, CLOCK_MONOTONIC);
+
+    if (unlikely(pthread_cond_init (&condvar->cond, &attr)))
+        abort ();
+#endif
     condvar->clock = CLOCK_MONOTONIC;
 }
 
@@ -257,7 +271,9 @@ 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;
+#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP
     int (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct timespec *);
+#endif
 
     if (th != NULL)
     {
@@ -277,6 +293,7 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
         }
     }
 
+#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP
     switch (condvar->clock)
     {
          case CLOCK_REALTIME:
@@ -290,6 +307,10 @@ int vlc_cond_timedwait (vlc_cond_t *condvar, vlc_mutex_t *p_mutex,
     }
 
     int val = cb (&condvar->cond, p_mutex, &ts);
+#else
+    int val = pthread_cond_timedwait(&condvar->cond, p_mutex, &ts);
+#endif
+
     if (val != ETIMEDOUT)
         VLC_THREAD_ASSERT ("timed-waiting on condition");