From 7455d3df0709c4460603fa787b264cf92f2c06d5 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Fri, 18 Jul 2003 15:48:28 +0000 Subject: [PATCH] code to remove channel from the event queue when it is deleted --- src/cas/generic/casChannelI.cc | 3 +++ src/cas/generic/casCoreClient.cc | 6 ++++-- src/cas/generic/casCoreClient.h | 8 ++++++++ src/cas/generic/casEventSys.cc | 23 +++++++++++++++++------ src/cas/generic/casEventSys.h | 2 ++ 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/cas/generic/casChannelI.cc b/src/cas/generic/casChannelI.cc index 1c28a3874..f29786bce 100644 --- a/src/cas/generic/casChannelI.cc +++ b/src/cas/generic/casChannelI.cc @@ -32,6 +32,9 @@ casChannelI::casChannelI ( casCoreClient & clientIn, casChannelI::~casChannelI () { + this->privateForPV.client().removeFromEventQueue ( + *this, this->accessRightsEvPending ); + this->pv.destroyAllIO ( this->ioList ); this->serverDeletePending = true; diff --git a/src/cas/generic/casCoreClient.cc b/src/cas/generic/casCoreClient.cc index 3139c3b17..c2b8916a0 100644 --- a/src/cas/generic/casCoreClient.cc +++ b/src/cas/generic/casCoreClient.cc @@ -19,6 +19,7 @@ #include "casCoreClient.h" #include "casAsyncPVExistIOI.h" #include "casAsyncPVAttachIOI.h" +#include "casChannelI.h" casCoreClient::casCoreClient ( caServerI & serverInternal ) : eventSys ( *this ) @@ -124,9 +125,10 @@ caStatus casCoreClient::channelCreateFailedResp ( } caStatus casCoreClient::channelDestroyEventNotify ( epicsGuard < casClientMutex > &, - casChannelI * const, ca_uint32_t ) + casChannelI * const pChan, ca_uint32_t ) { - return S_casApp_noSupport; + delete pChan; + return S_casApp_success; } void casCoreClient::casChannelDestroyFromInterfaceNotify ( diff --git a/src/cas/generic/casCoreClient.h b/src/cas/generic/casCoreClient.h index a3d031cc1..63394700d 100644 --- a/src/cas/generic/casCoreClient.h +++ b/src/cas/generic/casCoreClient.h @@ -108,6 +108,8 @@ public: bool & onTheEventQueue ); void addToEventQueue ( casChannelI &, bool & inTheEventQueue ); + void removeFromEventQueue ( class casChannelI &, + bool & inTheEventQueue ); void addToEventQueue ( class channelDestroyEvent & ev ); void enableEvents (); void disableEvents (); @@ -205,6 +207,12 @@ inline void casCoreClient::addToEventQueue ( } } +inline void casCoreClient::removeFromEventQueue ( class casChannelI & io, + bool & inTheEventQueue ) +{ + this->eventSys.removeFromEventQueue ( io, inTheEventQueue ); +} + inline void casCoreClient::addToEventQueue ( class channelDestroyEvent & ev ) { bool wakeUpNeeded = this->eventSys.addToEventQueue ( ev ); diff --git a/src/cas/generic/casEventSys.cc b/src/cas/generic/casEventSys.cc index f62933e49..5952b3a8b 100644 --- a/src/cas/generic/casEventSys.cc +++ b/src/cas/generic/casEventSys.cc @@ -235,7 +235,17 @@ caStatus casEventSys::addToEventQueue ( casAsyncIOI & event, return S_cas_success; } -bool casEventSys::addToEventQueue ( casChannelI & event, bool & inTheEventQueue ) +void casEventSys::removeFromEventQueue ( casAsyncIOI & io, bool & onTheEventQueue ) +{ + epicsGuard < epicsMutex > guard ( this->mutex ); + if ( onTheEventQueue ) { + onTheEventQueue = false; + this->eventLogQue.remove ( io ); + } +} + +bool casEventSys::addToEventQueue ( casChannelI & event, + bool & inTheEventQueue ) { bool wakeupRequired = false; { @@ -248,14 +258,15 @@ bool casEventSys::addToEventQueue ( casChannelI & event, bool & inTheEventQueue } return wakeupRequired; } - -void casEventSys::removeFromEventQueue ( casAsyncIOI & io, bool & onTheEventQueue ) + +void casEventSys::removeFromEventQueue ( class casChannelI & io, + bool & inTheEventQueue ) { epicsGuard < epicsMutex > guard ( this->mutex ); - if ( onTheEventQueue ) { - onTheEventQueue = false; + if ( inTheEventQueue ) { + inTheEventQueue = false; this->eventLogQue.remove ( io ); - } + } } bool casEventSys::addToEventQueue ( channelDestroyEvent & event ) diff --git a/src/cas/generic/casEventSys.h b/src/cas/generic/casEventSys.h index 83eb01391..811513cd0 100644 --- a/src/cas/generic/casEventSys.h +++ b/src/cas/generic/casEventSys.h @@ -85,6 +85,8 @@ public: bool & onTheEventQueue ); bool addToEventQueue ( casChannelI &, bool & inTheEventQueue ); + void removeFromEventQueue ( class casChannelI &, + bool & inTheEventQueue ); bool addToEventQueue ( class channelDestroyEvent & ); bool getNDuplicateEvents () const; void setDestroyPending ();