New event locking.

Removed CVS trash.
  Some compile fixes.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4716 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 1999-11-28 11:45:29 +00:00
parent 0979c96223
commit 16c1f79c04
10 changed files with 81 additions and 36 deletions

View File

@ -47,22 +47,31 @@
void wxAppBase::ProcessPendingEvents() void wxAppBase::ProcessPendingEvents()
{ {
// ensure that we're the only thread to modify the pending events list // ensure that we're the only thread to modify the pending events list
wxCRIT_SECT_LOCKER(locker, *wxPendingEventsLocker); wxENTER_CRIT_SECT( *wxPendingEventsLocker );
if ( !wxPendingEvents ) if ( !wxPendingEvents )
{
wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
return; return;
}
// iterate until the list becomes empty // iterate until the list becomes empty
wxNode *node = wxPendingEvents->First(); wxNode *node = wxPendingEvents->First();
while (node) while (node)
{ {
wxEvtHandler *handler = (wxEvtHandler *)node->Data(); wxEvtHandler *handler = (wxEvtHandler *)node->Data();
handler->ProcessPendingEvents();
delete node; delete node;
// In ProcessPendingEvents(), new handlers might be add
// and we can safely leave the critical section here.
wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
handler->ProcessPendingEvents();
wxENTER_CRIT_SECT( *wxPendingEventsLocker );
node = wxPendingEvents->First(); node = wxPendingEvents->First();
} }
wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
} }
int wxAppBase::OnExit() int wxAppBase::OnExit()

View File

@ -583,12 +583,6 @@ wxEvtHandler::~wxEvtHandler()
bool wxEvtHandler::ProcessThreadEvent(wxEvent& event) 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 // check that we are really in a child thread
wxASSERT_MSG( !wxThread::IsMain(), wxASSERT_MSG( !wxThread::IsMain(),
wxT("use ProcessEvent() in main thread") ); wxT("use ProcessEvent() in main thread") );
@ -602,6 +596,14 @@ bool wxEvtHandler::ProcessThreadEvent(wxEvent& event)
void wxEvtHandler::AddPendingEvent(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 ) if ( !m_pendingEvents )
m_pendingEvents = new wxList; m_pendingEvents = new wxList;
@ -609,6 +611,15 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
m_pendingEvents->Append(event2); m_pendingEvents->Append(event2);
#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); wxENTER_CRIT_SECT(*wxPendingEventsLocker);
if ( !wxPendingEvents ) if ( !wxPendingEvents )
@ -617,28 +628,49 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
// 3) Inform the system that new pending events are somwehere,
// and that these should be processed in idle time.
wxWakeUpIdle(); wxWakeUpIdle();
} }
void wxEvtHandler::ProcessPendingEvents() void wxEvtHandler::ProcessPendingEvents()
{ {
#if defined(__VISAGECPP__) #if defined(__VISAGECPP__)
wxCRIT_SECT_LOCKER(locker, m_eventsLocker); wxENTER_CRIT_SECT( m_eventsLocker);
#else #else
wxCRIT_SECT_LOCKER(locker, *m_eventsLocker); wxENTER_CRIT_SECT( *m_eventsLocker);
#endif #endif
wxNode *node = m_pendingEvents->First(); wxNode *node = m_pendingEvents->First();
wxEvent *event;
while ( node ) 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); ProcessEvent(*event);
delete event; delete event;
delete node; #if defined(__VISAGECPP__)
wxENTER_CRIT_SECT( m_eventsLocker);
#else
wxENTER_CRIT_SECT( *m_eventsLocker);
#endif
node = m_pendingEvents->First(); node = m_pendingEvents->First();
} }
#if defined(__VISAGECPP__)
wxLEAVE_CRIT_SECT( m_eventsLocker);
#else
wxLEAVE_CRIT_SECT( *m_eventsLocker);
#endif
} }
/* /*

View File

@ -11,8 +11,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "gdk/gdk.h"
#include "glib.h" #include <gdk/gdk.h>
#include <glib.h>
#include "wx/gsocket.h" #include "wx/gsocket.h"
#include "wx/unix/gsockunx.h" #include "wx/unix/gsockunx.h"

View File

@ -26,9 +26,9 @@
#include "wx/tooltip.h" #include "wx/tooltip.h"
#endif #endif
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
#include "gdk/gdkkeysyms.h" #include <gdk/gdkkeysyms.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// idle system // idle system

View File

@ -19,9 +19,9 @@
#include "wx/menu.h" #include "wx/menu.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "glib.h" #include <glib.h>
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -21,8 +21,8 @@
#include "wx/accel.h" #include "wx/accel.h"
#endif // wxUSE_ACCEL #endif // wxUSE_ACCEL
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// idle system // idle system

View File

@ -11,8 +11,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "gdk/gdk.h"
#include "glib.h" #include <gdk/gdk.h>
#include <glib.h>
#include "wx/gsocket.h" #include "wx/gsocket.h"
#include "wx/unix/gsockunx.h" #include "wx/unix/gsockunx.h"

View File

@ -26,9 +26,9 @@
#include "wx/tooltip.h" #include "wx/tooltip.h"
#endif #endif
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
#include "gdk/gdkkeysyms.h" #include <gdk/gdkkeysyms.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// idle system // idle system

View File

@ -19,9 +19,9 @@
#include "wx/menu.h" #include "wx/menu.h"
#include "wx/intl.h" #include "wx/intl.h"
#include "glib.h" #include <glib.h>
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -21,8 +21,8 @@
#include "wx/accel.h" #include "wx/accel.h"
#endif // wxUSE_ACCEL #endif // wxUSE_ACCEL
#include "gdk/gdk.h" #include <gdk/gdk.h>
#include "gtk/gtk.h" #include <gtk/gtk.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// idle system // idle system