code to remove channel from the event queue when it is deleted

This commit is contained in:
Jeff Hill
2003-07-18 15:48:28 +00:00
parent a2d4436b83
commit 7455d3df07
5 changed files with 34 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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

View File

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