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()
{
// ensure that we're the only thread to modify the pending events list
wxCRIT_SECT_LOCKER(locker, *wxPendingEventsLocker);
wxENTER_CRIT_SECT( *wxPendingEventsLocker );
if ( !wxPendingEvents )
{
wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
return;
}
// iterate until the list becomes empty
wxNode *node = wxPendingEvents->First();
while (node)
{
wxEvtHandler *handler = (wxEvtHandler *)node->Data();
handler->ProcessPendingEvents();
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();
}
wxLEAVE_CRIT_SECT( *wxPendingEventsLocker );
}
int wxAppBase::OnExit()

View 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,6 +611,15 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
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);
if ( !wxPendingEvents )
@ -617,28 +628,49 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event)
wxLEAVE_CRIT_SECT(*wxPendingEventsLocker);
// 3) Inform the system that new pending events are somwehere,
// and that these should be processed in idle time.
wxWakeUpIdle();
}
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
}
/*

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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