]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/event.cpp
Catching up to latest thread changes
[wxWidgets.git] / src / common / event.cpp
index fb953f101acdfd9b4adf8c371d30f0ad53f0d1f8..795bbef44856bbc83d6004b09c21da7a95bf9c79 100644 (file)
@@ -583,12 +583,6 @@ wxEvtHandler::~wxEvtHandler()
 
 bool wxEvtHandler::ProcessThreadEvent(wxEvent& event)
 {
-#if defined(__VISAGECPP__)
-    wxCriticalSectionLocker locker(m_eventsLocker);
-#else
-    wxCriticalSectionLocker locker(*m_eventsLocker);
-#endif
-
     // check that we are really in a child thread
     wxASSERT_MSG( !wxThread::IsMain(),
                   wxT("use ProcessEvent() in main thread") );
@@ -602,6 +596,14 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event)
 
 void wxEvtHandler::AddPendingEvent(wxEvent& event)
 {
+    // 1) Add event to list of pending events of this event handler
+
+#if defined(__VISAGECPP__)
+    wxENTER_CRIT_SECT( m_eventsLocker);
+#else
+    wxENTER_CRIT_SECT( *m_eventsLocker);
+#endif
+
     if ( !m_pendingEvents )
       m_pendingEvents = new wxList;
 
@@ -609,36 +611,66 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
 
     m_pendingEvents->Append(event2);
 
-    wxENTER_CRIT_SECT(wxPendingEventsLocker);
+#if defined(__VISAGECPP__)
+    wxLEAVE_CRIT_SECT( m_eventsLocker);
+#else
+    wxLEAVE_CRIT_SECT( *m_eventsLocker);
+#endif
+
+    // 2) Add this event handler to list of event handlers that
+    //    have pending events.
+    
+    wxENTER_CRIT_SECT(*wxPendingEventsLocker);
 
     if ( !wxPendingEvents )
         wxPendingEvents = new wxList;
     wxPendingEvents->Append(this);
 
-    wxLEAVE_CRIT_SECT(wxPendingEventsLocker);
-
+    // 3) Inform the system that new pending events are somwehere,
+    //    and that these should be processed in idle time.
+    
     wxWakeUpIdle();
+
+    wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
 }
 
 void wxEvtHandler::ProcessPendingEvents()
 {
 #if defined(__VISAGECPP__)
-    wxCRIT_SECT_LOCKER(locker, &m_eventsLocker);
+    wxENTER_CRIT_SECT( m_eventsLocker);
 #else
-    wxCRIT_SECT_LOCKER(locker, m_eventsLocker);
+    wxENTER_CRIT_SECT( *m_eventsLocker);
 #endif
 
     wxNode *node = m_pendingEvents->First();
-    wxEvent *event;
-
     while ( node )
     {
-        event = (wxEvent *)node->Data();
+        wxEvent *event = (wxEvent *)node->Data();
+        delete node;
+       
+        // In ProcessEvent, new events might get added and
+       // we can safely leave the crtical section here.
+#if defined(__VISAGECPP__)
+        wxLEAVE_CRIT_SECT( m_eventsLocker);
+#else
+        wxLEAVE_CRIT_SECT( *m_eventsLocker);
+#endif
         ProcessEvent(*event);
         delete event;
-        delete node;
+#if defined(__VISAGECPP__)
+        wxENTER_CRIT_SECT( m_eventsLocker);
+#else
+        wxENTER_CRIT_SECT( *m_eventsLocker);
+#endif
+       
         node = m_pendingEvents->First();
     }
+    
+#if defined(__VISAGECPP__)
+    wxLEAVE_CRIT_SECT( m_eventsLocker);
+#else
+    wxLEAVE_CRIT_SECT( *m_eventsLocker);
+#endif
 }
 
 /*