From: Enlightenment S. <no-...@en...> - 2010-02-22 20:09:12
|
Log: fix ecore-glib reentrance if using ecore_main_loop_begin() multiple times (reentrant/recursive) with glib doing threads, then it would deadlock since the same thread would get the lock it already have. multiple ecore_main_loop_begin() is required to implement WebKit's alert/confirm/prompt dialogs since there is no async reply with callbacks, rather one must return the value. By: Lucas de Marchi Author: barbieri Date: 2010-02-22 12:09:03 -0800 (Mon, 22 Feb 2010) New Revision: 46361 Modified: trunk/ecore/src/lib/ecore/ecore_glib.c Modified: trunk/ecore/src/lib/ecore/ecore_glib.c =================================================================== --- trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 17:38:35 UTC (rev 46360) +++ trunk/ecore/src/lib/ecore/ecore_glib.c 2010-02-22 20:09:03 UTC (rev 46361) @@ -167,14 +167,11 @@ static int _ecore_glib_select(int ecore_fds, fd_set *rfds, fd_set *wfds, fd_set *efds, struct timeval *ecore_timeout) { - static GStaticMutex lock = G_STATIC_MUTEX_INIT; - static GMutex *mutex = NULL; + GStaticMutex lock = G_STATIC_MUTEX_INIT; + GMutex *mutex = g_static_mutex_get_mutex(&lock); GMainContext *ctx = g_main_context_default(); int ret; - if (!mutex) - mutex = g_static_mutex_get_mutex(&lock); - if (g_main_context_acquire(ctx)) g_mutex_lock(mutex); else { |