diff --git a/configure.ac b/configure.ac index 0a6ae716eb..e0d942f298 100644 --- a/configure.ac +++ b/configure.ac @@ -1965,6 +1965,20 @@ AC_ARG_ENABLE([g-main-loop], ], [want_g_main_loop="no"]) +# thread safety + +AC_ARG_ENABLE([thread-safety], + [AC_HELP_STRING([--enable-thread-safety], + [enable thread safety. @<:@default=disabled@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + want_thread_safety="yes" + else + want_thread_safety="no" + fi + ], + [want_thread_safety="no"]) + # epoll AC_ARG_ENABLE([epoll], @@ -1992,6 +2006,10 @@ if test "x${with_glib}" = "xyes" || test "x${with_glib}" = "xalways" ; then want_glib="yes" fi +if test "x${want_thread_safety}" = "xyes" ; then + AC_DEFINE([HAVE_THREAD_SAFETY], [1], [Define to enable thread safety]) +fi + want_ecore_timer_dump="no" if test "x${build_profile}" = "xdebug" && test "x${ac_cv_func_backtrace}" = "xyes"; then want_ecore_timer_dump="yes" @@ -4130,6 +4148,7 @@ echo " Tiled 32BPP rotate......: $have_tile_rotate" echo echo "Ecore:" +echo " Thread safety..............: $want_thread_safety" echo " GLib support...............: $with_glib" echo " Use g_main_loop............: $want_g_main_loop" echo " Gathering memory statistic.: $ac_cv_func_mallinfo" diff --git a/src/lib/ecore/ecore_private.h b/src/lib/ecore/ecore_private.h index 7e7ff3a16e..f0add822fe 100644 --- a/src/lib/ecore/ecore_private.h +++ b/src/lib/ecore/ecore_private.h @@ -246,7 +246,12 @@ extern Eina_Lock _ecore_main_loop_lock; static inline void _ecore_lock(void) { +#ifdef HAVE_THREAD_SAFETY eina_lock_take(&_ecore_main_loop_lock); +#else + /* at least check we're not being called from a thread */ + EINA_MAIN_LOOP_CHECK_RETURN; +#endif _ecore_main_lock_count++; /* assert(_ecore_main_lock_count == 1); */ } @@ -256,7 +261,9 @@ _ecore_unlock(void) { _ecore_main_lock_count--; /* assert(_ecore_main_lock_count == 0); */ +#ifdef HAVE_THREAD_SAFETY eina_lock_release(&_ecore_main_loop_lock); +#endif } /*