From 1a2f2ad7e482668c9c94af54316ecbed98e1aac7 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Thu, 13 Mar 2003 01:29:08 +0000 Subject: [PATCH] wakeup the event queue when placing channel delete events in it --- src/cas/generic/casCoreClient.h | 11 ++++++++++- src/cas/generic/casEventSys.cc | 4 +++- src/cas/generic/casEventSys.h | 3 +-- src/cas/generic/casStrmClient.cc | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/cas/generic/casCoreClient.h b/src/cas/generic/casCoreClient.h index b734d49d1..513c48f4a 100644 --- a/src/cas/generic/casCoreClient.h +++ b/src/cas/generic/casCoreClient.h @@ -108,6 +108,7 @@ public: bool & onTheEventQueue ); void addToEventQueue ( casChannelI &, bool & inTheEventQueue ); + void addToEventQueue ( class channelDestroyEvent & ev ); void enableEvents (); void disableEvents (); caStatus casMonitorCallBack ( @@ -128,8 +129,8 @@ public: casMonEvent &, epicsGuard < evSysMutex > & ); protected: - mutable casClientMutex mutex; casEventSys eventSys; + mutable casClientMutex mutex; casCtx ctx; bool userStartedAsyncIO; @@ -202,6 +203,14 @@ inline void casCoreClient::addToEventQueue ( } } +inline void casCoreClient::addToEventQueue ( class channelDestroyEvent & ev ) +{ + bool wakeUpNeeded = this->eventSys.addToEventQueue ( ev ); + if ( wakeUpNeeded ) { + this->eventSignal (); + } +} + inline void casCoreClient::enableEvents () { this->eventSys.eventsOn (); diff --git a/src/cas/generic/casEventSys.cc b/src/cas/generic/casEventSys.cc index 8b80b6f72..84a3977ef 100644 --- a/src/cas/generic/casEventSys.cc +++ b/src/cas/generic/casEventSys.cc @@ -259,10 +259,12 @@ void casEventSys::removeFromEventQueue ( casAsyncIOI & io, bool & onTheEventQue } } -void casEventSys::addToEventQueue ( channelDestroyEvent & event ) +bool casEventSys::addToEventQueue ( channelDestroyEvent & event ) { epicsGuard < epicsMutex > guard ( this->mutex ); + bool wakeupRequired = ! this->dontProcess && this->eventLogQue.count()==0; this->eventLogQue.add ( event ); + return wakeupRequired; } void casEventSys::setDestroyPending () diff --git a/src/cas/generic/casEventSys.h b/src/cas/generic/casEventSys.h index 7ab5485d4..83eb01391 100644 --- a/src/cas/generic/casEventSys.h +++ b/src/cas/generic/casEventSys.h @@ -59,7 +59,6 @@ class casMonitor; class casMonEvent; class casCoreClient; -class evSysMutex; template < class MUTEX > class epicsGuard; class evSysMutex : public epicsMutex {}; @@ -86,7 +85,7 @@ public: bool & onTheEventQueue ); bool addToEventQueue ( casChannelI &, bool & inTheEventQueue ); - void addToEventQueue ( class channelDestroyEvent & ); + bool addToEventQueue ( class channelDestroyEvent & ); bool getNDuplicateEvents () const; void setDestroyPending (); void eventsOn (); diff --git a/src/cas/generic/casStrmClient.cc b/src/cas/generic/casStrmClient.cc index 3e1d341c4..539088809 100644 --- a/src/cas/generic/casStrmClient.cc +++ b/src/cas/generic/casStrmClient.cc @@ -1704,7 +1704,7 @@ void casStrmClient::casChannelDestroyNotify ( immediateUninstallNeeded ? & chan : 0, chan.getSID() ); if ( pEvent ) { - this->eventSys.addToEventQueue ( *pEvent ); + this->addToEventQueue ( *pEvent ); } else { this->forceDisconnect ();