add eina barrier to efl tree.

SVN revision: 78100
This commit is contained in:
Carsten Haitzler 2012-10-17 03:55:35 +00:00
parent 80f71e4393
commit 42a59387a6
9 changed files with 71 additions and 2 deletions

View File

@ -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}"

View File

@ -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.h>
]],
[[
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}])

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -204,4 +204,6 @@ eina_semaphore_release(Eina_Semaphore *sem EINA_UNUSED,
return EINA_FALSE;
}
#include "eina_inline_lock_barrier.x"
#endif

View File

@ -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 { \