From 42a59387a67f4c5c9604b2ae36a3cbbf5e02f47f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Wed, 17 Oct 2012 03:55:35 +0000 Subject: [PATCH] add eina barrier to efl tree. SVN revision: 78100 --- configure.ac | 7 +++- m4/efl_threads.m4 | 12 +++++++ src/lib/eina/Makefile.am | 3 +- src/lib/eina/eina_config.h.in | 5 +++ .../lib/eina}/eina_inline_lock_barrier.x | 0 src/lib/eina/eina_inline_lock_posix.x | 34 +++++++++++++++++++ src/lib/eina/eina_inline_lock_win32.x | 2 ++ src/lib/eina/eina_inline_lock_wince.x | 2 ++ src/lib/eina/eina_lock.h | 8 +++++ 9 files changed, 71 insertions(+), 2 deletions(-) rename {legacy/eina/src/include => src/lib/eina}/eina_inline_lock_barrier.x (100%) diff --git a/configure.ac b/configure.ac index e7e3cb2ae3..ceb351b4a6 100644 --- a/configure.ac +++ b/configure.ac @@ -513,6 +513,11 @@ EINA_CONFIG(ENABLE_LOG, test "x${enable_log}" = "xyes") EFL_CHECK_THREADS +if ! test "x${efl_have_pthread_barrier}" = "xno" ; then + EINA_CONFIGURE_HAVE_PTHREAD_BARRIER="#define EINA_HAVE_PTHREAD_BARRIER" +fi +AC_SUBST(EINA_CONFIGURE_HAVE_PTHREAD_BARRIER) + EINA_CONFIG(HAVE_DEBUG_THREADS, test "$want_debug_threads" = "yes") ### Modules @@ -802,7 +807,7 @@ echo "Configuration Options Summary:" echo echo " OS...................: ${host_os}" echo " Build Profile........: ${build_profile}" -echo " Threads Type.........: ${efl_have_threads} (spinlocks: ${efl_have_posix_threads_spinlock})" +echo " Threads Type.........: ${efl_have_threads} (spinlocks: ${efl_have_posix_threads_spinlock}) (barrier: ${efl_have_pthread_barrier})" echo " Cryptographic System.: ${build_crypto}" if test "x${have_windows}" = "xyes" ; then echo " Windows version......: ${_efl_windows_version}" diff --git a/m4/efl_threads.m4 b/m4/efl_threads.m4 index 90a5f8ac47..bd3a818eb0 100644 --- a/m4/efl_threads.m4 +++ b/m4/efl_threads.m4 @@ -64,6 +64,16 @@ id = pthread_self(); EFL_PTHREAD_LIBS=${_efl_threads_libs} ], [_efl_have_posix_threads="no"]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ +#include + ]], + [[ +pthread_barrier_t barrier; +pthread_barrier_init(&barrier, NULL, 1); + ]])], + [efl_have_pthread_barrier="yes"], + [efl_have_pthread_barrier="no"]) CFLAGS=${SAVE_CFLAGS} LIBS=${SAVE_LIBS} @@ -75,8 +85,10 @@ if test "x${_efl_have_posix_threads}" = "xyes" ; then else if test "x${_efl_have_win32_threads}" = "xyes" ; then efl_have_threads="Windows" + efl_have_pthread_barrier="no" else efl_have_threads="no" + efl_have_pthread_barrier="no" fi fi AC_MSG_RESULT([${efl_have_threads}]) diff --git a/src/lib/eina/Makefile.am b/src/lib/eina/Makefile.am index c3eb252f50..287b29aa8c 100644 --- a/src/lib/eina/Makefile.am +++ b/src/lib/eina/Makefile.am @@ -81,7 +81,8 @@ eina_refcount.h \ eina_mmap.h \ eina_xattr.h \ eina_value.h \ -eina_inline_value.x +eina_inline_value.x \ +eina_inline_lock_barrier.x # Will be back for developper after 1.2. # eina_model.h diff --git a/src/lib/eina/eina_config.h.in b/src/lib/eina/eina_config.h.in index 8b3b3567a7..979027062b 100644 --- a/src/lib/eina/eina_config.h.in +++ b/src/lib/eina/eina_config.h.in @@ -51,6 +51,11 @@ #define EINA_HAVE_THREADS #endif +#ifdef EINA_HAVE_PTHREAD_BARRIER +# undef EINA_HAVE_PTHREAD_BARRIER +#endif +@EINA_CONFIGURE_HAVE_PTHREAD_BARRIER@ + #ifdef EINA_HAVE_DEBUG_THREADS # undef EINA_HAVE_DEBUG_THREADS #endif diff --git a/legacy/eina/src/include/eina_inline_lock_barrier.x b/src/lib/eina/eina_inline_lock_barrier.x similarity index 100% rename from legacy/eina/src/include/eina_inline_lock_barrier.x rename to src/lib/eina/eina_inline_lock_barrier.x diff --git a/src/lib/eina/eina_inline_lock_posix.x b/src/lib/eina/eina_inline_lock_posix.x index 86cf1f7a7e..88c4b61c11 100644 --- a/src/lib/eina/eina_inline_lock_posix.x +++ b/src/lib/eina/eina_inline_lock_posix.x @@ -544,4 +544,38 @@ eina_semaphore_release(Eina_Semaphore *sem, int count_release EINA_UNUSED) return (sem_post(sem) == 0) ? EINA_TRUE : EINA_FALSE; } +#ifdef EINA_HAVE_PTHREAD_BARRIER +typedef struct _Eina_Barrier Eina_Barrier; + +struct _Eina_Barrier +{ + pthread_barrier_t barrier; +}; + +static inline Eina_Bool +eina_barrier_new(Eina_Barrier *barrier, int needed) +{ + if (!pthread_barrier_init(&(barrier->barrier), NULL, needed)) + return EINA_TRUE; + return EINA_FALSE; +} + +static inline void +eina_barrier_free(Eina_Barrier *barrier) +{ + pthread_barrier_destroy(&(barrier->barrier)); +} + +static inline Eina_Bool +eina_barrier_wait(Eina_Barrier *barrier) +{ + pthread_barrier_wait(&(barrier->barrier)); + return EINA_TRUE; +} + +#else +#include "eina_inline_lock_barrier.x" +#endif + + #endif diff --git a/src/lib/eina/eina_inline_lock_win32.x b/src/lib/eina/eina_inline_lock_win32.x index 856f97265e..383a543f98 100644 --- a/src/lib/eina/eina_inline_lock_win32.x +++ b/src/lib/eina/eina_inline_lock_win32.x @@ -551,4 +551,6 @@ eina_semaphore_release(Eina_Semaphore *sem, int count_release) return ReleaseSemaphore(*sem, count_release, NULL) ? EINA_TRUE : EINA_FALSE; } +#include "eina_inline_lock_barrier.x" + #endif diff --git a/src/lib/eina/eina_inline_lock_wince.x b/src/lib/eina/eina_inline_lock_wince.x index 38d7e08910..787795977f 100644 --- a/src/lib/eina/eina_inline_lock_wince.x +++ b/src/lib/eina/eina_inline_lock_wince.x @@ -204,4 +204,6 @@ eina_semaphore_release(Eina_Semaphore *sem EINA_UNUSED, return EINA_FALSE; } +#include "eina_inline_lock_barrier.x" + #endif diff --git a/src/lib/eina/eina_lock.h b/src/lib/eina/eina_lock.h index 5260ed9c4b..ceb19d7b71 100644 --- a/src/lib/eina/eina_lock.h +++ b/src/lib/eina/eina_lock.h @@ -106,6 +106,14 @@ static inline Eina_Bool eina_semaphore_lock(Eina_Semaphore *sem); /** @relates static Eina_Bool eina_semaphore_release(sem_t *sem, int count_release) */ static inline Eina_Bool eina_semaphore_release(Eina_Semaphore *sem, int count_release); +/** @relates static Eina_Bool eina_barrier_new(Eina_Barrier *barrier, int needed) @since 1.8 */ +static inline Eina_Bool eina_barrier_new(Eina_Barrier *barrier, int needed); +/** @relates static void eina_barrier_free(Eina_Barrier *barrier); @since 1.8 */ +static inline void eina_barrier_free(Eina_Barrier *barrier); +/** @relates static Eina_Bool eina_barrier_wait(Eina_Barrier *barrier); @since 1.8 */ +static inline Eina_Bool eina_barrier_wait(Eina_Barrier *barrier); + + #ifdef EINA_HAVE_DEBUG_THREADS # define EINA_MAIN_LOOP_CHECK_RETURN_VAL(val) \ do { \