add MutexGuiEnter/Leave to wxAppTraits, integrate native GTK+ GUI locking
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50757 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -133,6 +133,11 @@ public:
|
|||||||
virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer) = 0;
|
virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer) = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
virtual void MutexGuiEnter();
|
||||||
|
virtual void MutexGuiLeave();
|
||||||
|
#endif
|
||||||
|
|
||||||
// functions returning port-specific information
|
// functions returning port-specific information
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@@ -44,6 +44,10 @@ public:
|
|||||||
#if wxUSE_TIMER
|
#if wxUSE_TIMER
|
||||||
virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer);
|
virtual wxTimerImpl *CreateTimerImpl(wxTimer *timer);
|
||||||
#endif
|
#endif
|
||||||
|
#if wxUSE_THREADS && defined(__WXGTK20__)
|
||||||
|
virtual void MutexGuiEnter();
|
||||||
|
virtual void MutexGuiLeave();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (defined(__WXMAC__) || defined(__WXCOCOA__)) && wxUSE_STDPATHS
|
#if (defined(__WXMAC__) || defined(__WXCOCOA__)) && wxUSE_STDPATHS
|
||||||
virtual wxStandardPathsBase& GetStandardPaths();
|
virtual wxStandardPathsBase& GetStandardPaths();
|
||||||
|
@@ -664,6 +664,31 @@ void wxAppTraitsBase::SetLocale()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
void wxMutexGuiEnterImpl();
|
||||||
|
void wxMutexGuiLeaveImpl();
|
||||||
|
|
||||||
|
void wxAppTraitsBase::MutexGuiEnter()
|
||||||
|
{
|
||||||
|
wxMutexGuiEnterImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxAppTraitsBase::MutexGuiLeave()
|
||||||
|
{
|
||||||
|
wxMutexGuiLeaveImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
||||||
|
{
|
||||||
|
wxAppConsoleBase::GetInstance()->GetTraits()->MutexGuiEnter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void WXDLLIMPEXP_BASE wxMutexGuiLeave()
|
||||||
|
{
|
||||||
|
wxAppConsoleBase::GetInstance()->GetTraits()->MutexGuiLeave();
|
||||||
|
}
|
||||||
|
#endif // wxUSE_THREADS
|
||||||
|
|
||||||
#ifdef __WXDEBUG__
|
#ifdef __WXDEBUG__
|
||||||
|
|
||||||
bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal)
|
bool wxAppTraitsBase::ShowAssertDialog(const wxString& msgOriginal)
|
||||||
|
@@ -225,18 +225,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -356,7 +350,10 @@ 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);
|
||||||
@@ -581,3 +578,15 @@ void wxApp::OnAssertFailure(const wxChar *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif // __WXDEBUG__
|
#endif // __WXDEBUG__
|
||||||
|
|
||||||
|
#if wxUSE_THREADS
|
||||||
|
void wxGUIAppTraits::MutexGuiEnter()
|
||||||
|
{
|
||||||
|
gdk_threads_enter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxGUIAppTraits::MutexGuiLeave()
|
||||||
|
{
|
||||||
|
gdk_threads_leave();
|
||||||
|
}
|
||||||
|
#endif // wxUSE_THREADS
|
||||||
|
@@ -1679,7 +1679,7 @@ void wxThreadModule::OnExit()
|
|||||||
// GUI Serialization copied from MSW implementation
|
// GUI Serialization copied from MSW implementation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
void wxMutexGuiEnterImpl()
|
||||||
{
|
{
|
||||||
// this would dead lock everything...
|
// this would dead lock everything...
|
||||||
wxASSERT_MSG( !wxThread::IsMain(),
|
wxASSERT_MSG( !wxThread::IsMain(),
|
||||||
@@ -1701,7 +1701,7 @@ void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
|||||||
gs_critsectGui->Enter();
|
gs_critsectGui->Enter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiLeave()
|
void wxMutexGuiLeaveImpl()
|
||||||
{
|
{
|
||||||
wxCriticalSectionLocker enter(*gs_critsectWaitingForGui);
|
wxCriticalSectionLocker enter(*gs_critsectWaitingForGui);
|
||||||
|
|
||||||
|
@@ -1292,7 +1292,7 @@ void wxThreadModule::OnExit()
|
|||||||
// not a mutex, so the names are a bit confusing
|
// not a mutex, so the names are a bit confusing
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
void wxMutexGuiEnterImpl()
|
||||||
{
|
{
|
||||||
// this would dead lock everything...
|
// this would dead lock everything...
|
||||||
wxASSERT_MSG( !wxThread::IsMain(),
|
wxASSERT_MSG( !wxThread::IsMain(),
|
||||||
@@ -1314,7 +1314,7 @@ void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
|||||||
gs_critsectGui->Enter();
|
gs_critsectGui->Enter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiLeave()
|
void wxMutexGuiLeaveImpl()
|
||||||
{
|
{
|
||||||
wxCriticalSectionLocker enter(*gs_critsectWaitingForGui);
|
wxCriticalSectionLocker enter(*gs_critsectWaitingForGui);
|
||||||
|
|
||||||
|
@@ -985,7 +985,7 @@ void WXDLLEXPORT wxWakeUpMainThread()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXDLLEXPORT wxMutexGuiEnter()
|
void wxMutexGuiEnterImpl()
|
||||||
{
|
{
|
||||||
// this would dead lock everything...
|
// this would dead lock everything...
|
||||||
wxASSERT_MSG( !wxThread::IsMain(),
|
wxASSERT_MSG( !wxThread::IsMain(),
|
||||||
@@ -1007,7 +1007,7 @@ void WXDLLEXPORT wxMutexGuiEnter()
|
|||||||
gs_pCritsectGui->Enter();
|
gs_pCritsectGui->Enter();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXDLLEXPORT wxMutexGuiLeave()
|
void wxMutexGuiLeaveImpl()
|
||||||
{
|
{
|
||||||
wxCriticalSectionLocker enter(*gs_pCritsectWaitingForGui);
|
wxCriticalSectionLocker enter(*gs_pCritsectWaitingForGui);
|
||||||
|
|
||||||
|
@@ -557,11 +557,11 @@ void wxThreadModule::OnExit()
|
|||||||
// not a mutex, so the names are a bit confusing
|
// not a mutex, so the names are a bit confusing
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiEnter()
|
void wxMutexGuiEnterImpl()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void WXDLLIMPEXP_BASE wxMutexGuiLeave()
|
void wxMutexGuiLeaveImpl()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1800,12 +1800,12 @@ static void DeleteThread(wxThread *This)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMutexGuiEnter()
|
void wxMutexGuiEnterImpl()
|
||||||
{
|
{
|
||||||
gs_mutexGui->Lock();
|
gs_mutexGui->Lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxMutexGuiLeave()
|
void wxMutexGuiLeaveImpl()
|
||||||
{
|
{
|
||||||
gs_mutexGui->Unlock();
|
gs_mutexGui->Unlock();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user