diff --git a/src/ca/cac.cpp b/src/ca/cac.cpp index ea532ca6f..477c6959b 100644 --- a/src/ca/cac.cpp +++ b/src/ca/cac.cpp @@ -658,8 +658,7 @@ baseNMIU * cac::destroyIO ( if ( pIO ) { class netSubscription * pSubscr = pIO->isSubscription (); if ( pSubscr ) { - chan.getPIIU(guard)->subscriptionCancelRequest ( - guard, chan, *pSubscr ); + pSubscr->unsubscribeIfRequired ( guard, chan ); } // this uninstalls from the list and destroys the IO diff --git a/src/ca/nciu.cpp b/src/ca/nciu.cpp index e3435baeb..2e1254766 100644 --- a/src/ca/nciu.cpp +++ b/src/ca/nciu.cpp @@ -83,15 +83,16 @@ void nciu::destroy ( epicsGuard < epicsMutex > & callbackControlGuard, epicsGuard < epicsMutex > & mutualExclusionGuard ) { + while ( baseNMIU * pNetIO = this->eventq.first () ) { + assert ( this->cacCtx.destroyIO ( + callbackControlGuard, mutualExclusionGuard, + pNetIO->getId (), *this ) ); + } + // if the claim reply has not returned yet then we will issue // the clear channel request to the server when the claim reply // arrives and there is no matching nciu in the client if ( this->channelNode::isInstalledInServer ( mutualExclusionGuard ) ) { - while ( baseNMIU * pNetIO = this->eventq.first () ) { - assert ( this->cacCtx.destroyIO ( - callbackControlGuard, mutualExclusionGuard, - pNetIO->getId (), *this ) ); - } this->getPIIU(mutualExclusionGuard)->clearChannelRequest ( mutualExclusionGuard, this->sid, this->id ); } diff --git a/src/ca/netIO.h b/src/ca/netIO.h index a9b12a110..75a3a21e5 100644 --- a/src/ca/netIO.h +++ b/src/ca/netIO.h @@ -89,6 +89,8 @@ public: epicsGuard < epicsMutex > & ) const; void subscribeIfRequired ( epicsGuard < epicsMutex > & guard, nciu & chan ); + void unsubscribeIfRequired ( + epicsGuard < epicsMutex > & guard, nciu & chan ); void subscriptionUpdateIfRequired ( epicsGuard < epicsMutex > &, nciu & ); protected: diff --git a/src/ca/netSubscription.cpp b/src/ca/netSubscription.cpp index 2ffaec1e5..dd902477f 100644 --- a/src/ca/netSubscription.cpp +++ b/src/ca/netSubscription.cpp @@ -170,6 +170,16 @@ void netSubscription::subscribeIfRequired ( } } +void netSubscription::unsubscribeIfRequired ( + epicsGuard < epicsMutex > & guard, nciu & chan ) +{ + if ( this->subscribed ) { + chan.getPIIU(guard)->subscriptionCancelRequest ( + guard, chan, *this ); + this->subscribed = false; + } +} + void netSubscription::subscriptionUpdateIfRequired ( epicsGuard < epicsMutex > & guard, nciu & chan ) {