fixed logic surrounding subscription cancel

1) When channel is destroyed, but subscription not installed into a server
2) When subscription is destroyed, but has not been installed in server
This commit is contained in:
Jeff Hill
2004-05-21 00:57:51 +00:00
parent 41aeb709e5
commit 329172afc7
4 changed files with 19 additions and 7 deletions

View File

@@ -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

View File

@@ -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 );
}

View File

@@ -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:

View File

@@ -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 )
{