[vlc-devel] [RFC PATCH 6/6] android: fix monotonic cond_timedwait on newer versions

Rémi Denis-Courmont remi at remlab.net
Wed Oct 8 19:10:39 CEST 2014


Le mercredi 8 octobre 2014, 18:26:09 Thomas Guillem a écrit :
> 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 | 33 +++++++++++++++++++++------------
>  2 files changed, 22 insertions(+), 13 deletions(-)
> 
> diff --git a/configure.ac b/configure.ac
> index 616ba32..7d4b6b6 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..50b3edd 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,7 @@ 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 (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct timespec
> *); +    int (*cb)(pthread_cond_t *, pthread_mutex_t *, const struct
> timespec *) = NULL;
> 
>      if (th != NULL)
>      {
> @@ -277,17 +287,16 @@ int vlc_cond_timedwait (vlc_cond_t *condvar,
> vlc_mutex_t *p_mutex, }
>      }
> 
> -    switch (condvar->clock)
> -    {
> -         case CLOCK_REALTIME:
> -             cb = pthread_cond_timedwait;
> -             break;
> -         case CLOCK_MONOTONIC:
> -             cb = pthread_cond_timedwait_monotonic_np;
> -             break;
> -         default:
> -             assert (0);
> -    }
> +    if (condvar->clock == CLOCK_MONOTONIC) {
> +#if defined (HAVE_PTHREAD_CONDATTR_SETCLOCK)
> +        cb = pthread_cond_timedwait;

I guess that works but I'd avoid the callback in this case.

> +#elif defined (HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC_NP)
> +        cb = pthread_cond_timedwait_monotonic_np;
> +#endif
> +    } else if (condvar->clock == CLOCK_REALTIME)
> +        cb = pthread_cond_timedwait;
> +    if (!cb)
> +        assert (0);
> 
>      int val = cb (&condvar->cond, p_mutex, &ts);
>      if (val != ETIMEDOUT)

-- 
Rémi Denis-Courmont
http://www.remlab.net/




More information about the vlc-devel mailing list