Make m_idleMutex an object instead of a pointer. Use bool for hook-installed flag, the actual hook id is not needed.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62399 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Paul Cornett
2009-10-13 15:40:35 +00:00
parent cd644aa10f
commit 4d4ec2a507
2 changed files with 21 additions and 37 deletions

View File

@@ -14,10 +14,6 @@
// classes // classes
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#if wxUSE_THREADS
class WXDLLIMPEXP_FWD_BASE wxMutex;
#endif
#if wxUSE_LIBHILDON || wxUSE_LIBHILDON2 #if wxUSE_LIBHILDON || wxUSE_LIBHILDON2
typedef struct _HildonProgram HildonProgram; typedef struct _HildonProgram HildonProgram;
#endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2 #endif // wxUSE_LIBHILDON || wxUSE_LIBHILDON2
@@ -81,7 +77,7 @@ private:
bool m_isInAssert; bool m_isInAssert;
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutex* m_idleMutex; wxMutex m_idleMutex;
#endif #endif
guint m_idleSourceId; guint m_idleSourceId;

View File

@@ -60,9 +60,9 @@ wx_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer data)
wxApp* app = wxTheApp; wxApp* app = wxTheApp;
if (app != NULL) if (app != NULL)
app->WakeUpIdle(); app->WakeUpIdle();
gulong* hook_id = (gulong*)data; bool* hook_installed = (bool*)data;
// record that hook is not installed // record that hook is not installed
*hook_id = 0; *hook_installed = false;
// remove hook // remove hook
return false; return false;
} }
@@ -73,28 +73,30 @@ static void wx_add_idle_hooks()
{ {
// "event" hook // "event" hook
{ {
static gulong hook_id = 0; static bool hook_installed;
if (hook_id == 0) if (!hook_installed)
{ {
static guint sig_id = 0; static guint sig_id;
if (sig_id == 0) if (sig_id == 0)
sig_id = g_signal_lookup("event", GTK_TYPE_WIDGET); sig_id = g_signal_lookup("event", GTK_TYPE_WIDGET);
hook_id = g_signal_add_emission_hook( hook_installed = true;
sig_id, 0, wx_emission_hook, &hook_id, NULL); g_signal_add_emission_hook(
sig_id, 0, wx_emission_hook, &hook_installed, NULL);
} }
} }
// "size_allocate" hook // "size_allocate" hook
// Needed to match the behavior of the old idle system, // Needed to match the behavior of the old idle system,
// but probably not necessary. // but probably not necessary.
{ {
static gulong hook_id = 0; static bool hook_installed;
if (hook_id == 0) if (!hook_installed)
{ {
static guint sig_id = 0; static guint sig_id;
if (sig_id == 0) if (sig_id == 0)
sig_id = g_signal_lookup("size_allocate", GTK_TYPE_WIDGET); sig_id = g_signal_lookup("size_allocate", GTK_TYPE_WIDGET);
hook_id = g_signal_add_emission_hook( hook_installed = true;
sig_id, 0, wx_emission_hook, &hook_id, NULL); g_signal_add_emission_hook(
sig_id, 0, wx_emission_hook, &hook_installed, NULL);
} }
} }
} }
@@ -114,7 +116,7 @@ bool wxApp::DoIdle()
// Needed if an idle event handler runs a new event loop, // Needed if an idle event handler runs a new event loop,
// for example by showing a dialog. // for example by showing a dialog.
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexLocker lock(*m_idleMutex); wxMutexLocker lock(m_idleMutex);
#endif #endif
id_save = m_idleSourceId; id_save = m_idleSourceId;
m_idleSourceId = 0; m_idleSourceId = 0;
@@ -138,7 +140,7 @@ bool wxApp::DoIdle()
gdk_threads_leave(); gdk_threads_leave();
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexLocker lock(*m_idleMutex); wxMutexLocker lock(m_idleMutex);
#endif #endif
// if a new idle source was added during ProcessIdle // if a new idle source was added during ProcessIdle
if (m_idleSourceId != 0) if (m_idleSourceId != 0)
@@ -150,7 +152,8 @@ bool wxApp::DoIdle()
// Pending events can be added asynchronously, // Pending events can be added asynchronously,
// need to keep idle source if any have appeared // need to keep idle source if any have appeared
needMore = needMore || HasPendingEvents(); if (HasPendingEvents())
needMore = true;
// if more idle processing requested // if more idle processing requested
if (needMore) if (needMore)
@@ -189,10 +192,6 @@ IMPLEMENT_DYNAMIC_CLASS(wxApp,wxEvtHandler)
wxApp::wxApp() wxApp::wxApp()
{ {
m_isInAssert = false; m_isInAssert = false;
#if wxUSE_THREADS
m_idleMutex = NULL;
#endif
m_idleSourceId = 0; m_idleSourceId = 0;
} }
@@ -445,9 +444,6 @@ bool wxApp::Initialize(int& argc_, wxChar **argv_)
wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding()); wxFont::SetDefaultEncoding(wxLocale::GetSystemEncoding());
#endif #endif
#if wxUSE_THREADS
m_idleMutex = new wxMutex;
#endif
// make sure GtkWidget type is loaded, idle hooks need it // make sure GtkWidget type is loaded, idle hooks need it
g_type_class_ref(GTK_TYPE_WIDGET); g_type_class_ref(GTK_TYPE_WIDGET);
WakeUpIdle(); WakeUpIdle();
@@ -466,20 +462,12 @@ void wxApp::CleanUp()
gdk_threads_leave(); gdk_threads_leave();
wxAppBase::CleanUp(); wxAppBase::CleanUp();
// delete this mutex as late as possible as it's used from WakeUpIdle(), in
// particular do it after calling the base class CleanUp() which can result
// in it being called
#if wxUSE_THREADS
delete m_idleMutex;
m_idleMutex = NULL;
#endif
} }
void wxApp::WakeUpIdle() void wxApp::WakeUpIdle()
{ {
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexLocker lock(*m_idleMutex); wxMutexLocker lock(m_idleMutex);
#endif #endif
if (m_idleSourceId == 0) if (m_idleSourceId == 0)
m_idleSourceId = g_idle_add_full(G_PRIORITY_LOW, wxapp_idle_callback, NULL, NULL); m_idleSourceId = g_idle_add_full(G_PRIORITY_LOW, wxapp_idle_callback, NULL, NULL);
@@ -490,7 +478,7 @@ void wxApp::WakeUpIdle()
bool wxApp::EventsPending() bool wxApp::EventsPending()
{ {
#if wxUSE_THREADS #if wxUSE_THREADS
wxMutexLocker lock(*m_idleMutex); wxMutexLocker lock(m_idleMutex);
#endif #endif
if (m_idleSourceId != 0) if (m_idleSourceId != 0)
{ {