if ! test "x${efl_have_threads}" = "xno" ; then
EINA_CONFIGURE_HAVE_THREADS="#define EINA_HAVE_THREADS"
fi
+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_THREADS)
+AC_SUBST(EINA_CONFIGURE_HAVE_PTHREAD_BARRIER)
AM_CONDITIONAL([EINA_HAVE_THREADS], [! test "x${efl_have_threads}" = "xno"])
if test "x${efl_have_debug_threads}" = "xyes"; then
echo " Thread Support.......: ${efl_have_threads}"
if test "${efl_have_threads}" = "POSIX" ; then
echo " spinlock...........: ${efl_have_posix_threads_spinlock}"
+echo " barrier............: ${efl_have_pthread_barrier}"
echo " debug usage........: ${efl_have_debug_threads}"
echo " on/off support.....: ${efl_have_on_off_threads}"
fi
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}
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}])
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
#endif
@EINA_CONFIGURE_HAVE_THREADS@
+#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
--- /dev/null
+typedef struct _Eina_Barrier Eina_Barrier;
+
+struct _Eina_Barrier
+{
+ int needed, called;
+ Eina_Lock lock, cond_lock;
+ Eina_Condition cond;
+};
+
+static inline Eina_Bool
+eina_barrier_new(Eina_Barrier *barrier, int needed)
+{
+ barrier->needed = needed;
+ barrier->called = 0;
+ if (!eina_lock_new(&(barrier->lock)))
+ return EINA_FALSE;
+ if (!eina_lock_new(&(barrier->cond_lock)))
+ return EINA_FALSE;
+ if (!eina_condition_new(&(barrier->cond), &(barrier->cond_lock)))
+ return EINA_FALSE;
+ return EINA_TRUE;
+}
+
+static inline void
+eina_barrier_free(Eina_Barrier *barrier)
+{
+ eina_condition_free(&(barrier->cond));
+ eina_lock_free(&(barrier->cond_lock));
+ eina_lock_free(&(barrier->lock));
+ barrier->needed = 0;
+ barrier->called = 0;
+}
+
+static inline Eina_Bool
+eina_barrier_wait(Eina_Barrier *barrier)
+{
+ eina_lock_take(&(barrier->lock));
+ barrier->called++;
+ if (barrier->called == barrier->needed)
+ {
+ barrier->called = 0;
+ eina_condition_broadcast(&(barrier->cond));
+ }
+ else
+ eina_condition_wait(&(barrier->cond));
+ eina_lock_release(&(barrier->lock));
+ return EINA_TRUE;
+}
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
return EINA_TRUE;
}
+#include "eina_inline_lock_barrier.x"
+
/**
* @}
*/
return ReleaseSemaphore(*sem, count_release, NULL) ? EINA_TRUE : EINA_FALSE;
}
+#include "eina_inline_lock_barrier.x"
+
#endif
return EINA_FALSE;
}
+#include "eina_inline_lock_barrier.x"
+
#endif
/** @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 { \