use GTK-specific GUI lock

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44245 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett 2007-01-18 18:13:34 +00:00
parent 186453cc7c
commit 165d3652ff
2 changed files with 21 additions and 6 deletions

View File

@ -247,18 +247,12 @@ static GPollFunc wxgs_poll_func;
extern "C" { extern "C" {
static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
{ {
gdk_threads_enter();
wxMutexGuiLeave();
g_mainThreadLocked = true; g_mainThreadLocked = true;
gint res = (*wxgs_poll_func)(ufds, nfds, timeout); gint res = (*wxgs_poll_func)(ufds, nfds, timeout);
wxMutexGuiEnter();
g_mainThreadLocked = false; g_mainThreadLocked = false;
gdk_threads_leave();
return res; return res;
} }
} }
@ -408,6 +402,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
#if wxUSE_THREADS #if wxUSE_THREADS
if (!g_thread_supported()) if (!g_thread_supported())
g_thread_init(NULL); g_thread_init(NULL);
gdk_threads_init();
wxgs_poll_func = g_main_context_get_poll_func(NULL); wxgs_poll_func = g_main_context_get_poll_func(NULL);
g_main_context_set_poll_func(NULL, wxapp_poll_func); g_main_context_set_poll_func(NULL, wxapp_poll_func);
@ -562,3 +557,15 @@ void wxApp::SuspendIdleCallback()
wxAddEmissionHook(); wxAddEmissionHook();
} }
} }
#if wxUSE_THREADS
void wxMutexGuiEnter()
{
gdk_threads_enter();
}
void wxMutexGuiLeave()
{
gdk_threads_leave();
}
#endif

View File

@ -132,10 +132,12 @@ static wxMutex *gs_mutexDeleteThread = (wxMutex *)NULL;
// gs_nThreadsBeingDeleted will have been deleted // gs_nThreadsBeingDeleted will have been deleted
static wxCondition *gs_condAllDeleted = (wxCondition *)NULL; static wxCondition *gs_condAllDeleted = (wxCondition *)NULL;
#ifndef __WXGTK20__
// this mutex must be acquired before any call to a GUI function // this mutex must be acquired before any call to a GUI function
// (it's not inside #if wxUSE_GUI because this file is compiled as part // (it's not inside #if wxUSE_GUI because this file is compiled as part
// of wxBase) // of wxBase)
static wxMutex *gs_mutexGui = NULL; static wxMutex *gs_mutexGui = NULL;
#endif
// when we wait for a thread to exit, we're blocking on a condition which the // when we wait for a thread to exit, we're blocking on a condition which the
// thread signals in its SignalExit() method -- but this condition can't be a // thread signals in its SignalExit() method -- but this condition can't be a
@ -1624,8 +1626,10 @@ bool wxThreadModule::OnInit()
gs_mutexAllThreads = new wxMutex(); gs_mutexAllThreads = new wxMutex();
#ifndef __WXGTK20__
gs_mutexGui = new wxMutex(); gs_mutexGui = new wxMutex();
gs_mutexGui->Lock(); gs_mutexGui->Lock();
#endif
gs_mutexDeleteThread = new wxMutex(); gs_mutexDeleteThread = new wxMutex();
gs_condAllDeleted = new wxCondition(*gs_mutexDeleteThread); gs_condAllDeleted = new wxCondition(*gs_mutexDeleteThread);
@ -1678,9 +1682,11 @@ void wxThreadModule::OnExit()
delete gs_mutexAllThreads; delete gs_mutexAllThreads;
#ifndef __WXGTK20__
// destroy GUI mutex // destroy GUI mutex
gs_mutexGui->Unlock(); gs_mutexGui->Unlock();
delete gs_mutexGui; delete gs_mutexGui;
#endif
// and free TLD slot // and free TLD slot
(void)pthread_key_delete(gs_keySelf); (void)pthread_key_delete(gs_keySelf);
@ -1727,6 +1733,7 @@ static void DeleteThread(wxThread *This)
} }
} }
#ifndef __WXGTK20__
void wxMutexGuiEnter() void wxMutexGuiEnter()
{ {
gs_mutexGui->Lock(); gs_mutexGui->Lock();
@ -1736,6 +1743,7 @@ void wxMutexGuiLeave()
{ {
gs_mutexGui->Unlock(); gs_mutexGui->Unlock();
} }
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// include common implementation code // include common implementation code