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:
parent
186453cc7c
commit
165d3652ff
@ -247,18 +247,12 @@ static GPollFunc wxgs_poll_func;
|
||||
extern "C" {
|
||||
static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout )
|
||||
{
|
||||
gdk_threads_enter();
|
||||
|
||||
wxMutexGuiLeave();
|
||||
g_mainThreadLocked = true;
|
||||
|
||||
gint res = (*wxgs_poll_func)(ufds, nfds, timeout);
|
||||
|
||||
wxMutexGuiEnter();
|
||||
g_mainThreadLocked = false;
|
||||
|
||||
gdk_threads_leave();
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
@ -408,6 +402,7 @@ bool wxApp::Initialize(int& argc, wxChar **argv)
|
||||
#if wxUSE_THREADS
|
||||
if (!g_thread_supported())
|
||||
g_thread_init(NULL);
|
||||
gdk_threads_init();
|
||||
|
||||
wxgs_poll_func = g_main_context_get_poll_func(NULL);
|
||||
g_main_context_set_poll_func(NULL, wxapp_poll_func);
|
||||
@ -562,3 +557,15 @@ void wxApp::SuspendIdleCallback()
|
||||
wxAddEmissionHook();
|
||||
}
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
void wxMutexGuiEnter()
|
||||
{
|
||||
gdk_threads_enter();
|
||||
}
|
||||
|
||||
void wxMutexGuiLeave()
|
||||
{
|
||||
gdk_threads_leave();
|
||||
}
|
||||
#endif
|
||||
|
@ -132,10 +132,12 @@ static wxMutex *gs_mutexDeleteThread = (wxMutex *)NULL;
|
||||
// gs_nThreadsBeingDeleted will have been deleted
|
||||
static wxCondition *gs_condAllDeleted = (wxCondition *)NULL;
|
||||
|
||||
#ifndef __WXGTK20__
|
||||
// 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
|
||||
// of wxBase)
|
||||
static wxMutex *gs_mutexGui = NULL;
|
||||
#endif
|
||||
|
||||
// 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
|
||||
@ -1624,8 +1626,10 @@ bool wxThreadModule::OnInit()
|
||||
|
||||
gs_mutexAllThreads = new wxMutex();
|
||||
|
||||
#ifndef __WXGTK20__
|
||||
gs_mutexGui = new wxMutex();
|
||||
gs_mutexGui->Lock();
|
||||
#endif
|
||||
|
||||
gs_mutexDeleteThread = new wxMutex();
|
||||
gs_condAllDeleted = new wxCondition(*gs_mutexDeleteThread);
|
||||
@ -1678,9 +1682,11 @@ void wxThreadModule::OnExit()
|
||||
|
||||
delete gs_mutexAllThreads;
|
||||
|
||||
#ifndef __WXGTK20__
|
||||
// destroy GUI mutex
|
||||
gs_mutexGui->Unlock();
|
||||
delete gs_mutexGui;
|
||||
#endif
|
||||
|
||||
// and free TLD slot
|
||||
(void)pthread_key_delete(gs_keySelf);
|
||||
@ -1727,6 +1733,7 @@ static void DeleteThread(wxThread *This)
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef __WXGTK20__
|
||||
void wxMutexGuiEnter()
|
||||
{
|
||||
gs_mutexGui->Lock();
|
||||
@ -1736,6 +1743,7 @@ void wxMutexGuiLeave()
|
||||
{
|
||||
gs_mutexGui->Unlock();
|
||||
}
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// include common implementation code
|
||||
|
Loading…
Reference in New Issue
Block a user