jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d0bae13693c025293bd2787f15cb22ac99efeb17
commit d0bae13693c025293bd2787f15cb22ac99efeb17 Author: Jean-Philippe ANDRE <[email protected]> Date: Sun Nov 2 15:02:32 2014 +0900 Eina lock: try to fix compilation for OSX This is a quick fix. It looks like OSX doesn't provide the same infra as linux for cond_timedwait, but instead they provide directly a relative time wait function. Since I don't have any build / test environment for OSX, this is as far as I can go. Arguably, OSX libc seems to use gettimeofday() for cond_timedwait, so this should close T1701. See the pthread cond implementation: http://www.opensource.apple.com/source/Libc/Libc-167/pthreads.subproj/pthread_cond.c --- src/lib/eina/eina_inline_lock_posix.x | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/lib/eina/eina_inline_lock_posix.x b/src/lib/eina/eina_inline_lock_posix.x index 1da4a3d..18732f6e 100644 --- a/src/lib/eina/eina_inline_lock_posix.x +++ b/src/lib/eina/eina_inline_lock_posix.x @@ -117,7 +117,9 @@ struct _Eina_Condition { Eina_Lock *lock; /**< The lock for this condition */ pthread_cond_t condition; /**< The condition variable */ +#if defined(__clockid_t_defined) clockid_t clkid; /**< The attached clock for timedwait */ +#endif }; struct _Eina_RWLock @@ -346,25 +348,28 @@ eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex) memset(cond, 0, sizeof (Eina_Condition)); #endif + cond->lock = mutex; pthread_condattr_init(&attr); - cond->clkid = (clockid_t) 0; + /* OSX doesn't provide clockid_t or clock_gettime. */ +#if defined(__clockid_t_defined) + cond->clkid = (clockid_t) 0; /* We try here to chose the best clock for cond_timedwait */ -#if defined(CLOCK_MONOTONIC_RAW) +# if defined(CLOCK_MONOTONIC_RAW) if (!pthread_condattr_setclock(&attr, CLOCK_MONOTONIC_RAW)) cond->clkid = CLOCK_MONOTONIC_RAW; -#endif -#if defined(CLOCK_MONOTONIC) +# endif +# if defined(CLOCK_MONOTONIC) if (!cond->clkid && !pthread_condattr_setclock(&attr, CLOCK_MONOTONIC)) cond->clkid = CLOCK_MONOTONIC; -#endif -#if defined(CLOCK_REALTIME) +# endif +# if defined(CLOCK_REALTIME) if (!cond->clkid && !pthread_condattr_setclock(&attr, CLOCK_REALTIME)) cond->clkid = CLOCK_REALTIME; +# endif #endif - cond->lock = mutex; - if (pthread_cond_init(&cond->condition, cond->clkid ? &attr : NULL) != 0) + if (pthread_cond_init(&cond->condition, &attr) != 0) { pthread_condattr_destroy(&attr); #ifdef EINA_HAVE_DEBUG_THREADS @@ -434,14 +439,17 @@ eina_condition_timedwait(Eina_Condition *cond, double t) return EINA_FALSE; } +#if defined(__clockid_t_defined) if (cond->clkid) { if (clock_gettime(cond->clkid, &ts) != 0) return EINA_FALSE; } else +#endif { - /* Obsolete - this probably will never happen */ + /* Obsolete for Linux. + * TODO: use pthread_cond_timedwait_relative_np for OSX. */ struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return EINA_FALSE; --
