proper cleanup of local channels

This commit is contained in:
Jeff Hill
2000-09-14 00:33:35 +00:00
parent 5e764be847
commit d727e229eb
4 changed files with 27 additions and 14 deletions

View File

@@ -899,9 +899,9 @@ bool cac::createChannelIO (const char *pName, cacChannel &chan)
{
cacLocalChannelIO *pIO;
pIO = this->services.createChannelIO ( pName, chan );
pIO = this->services.createChannelIO ( pName, *this, chan );
if ( ! pIO ) {
pIO = cacGlobalServiceList.createChannelIO ( pName, chan );
pIO = cacGlobalServiceList.createChannelIO ( pName, *this, chan );
if ( ! pIO ) {
if ( ! this->pudpiiu ) {
if ( ! this->setupUDP () ) {
@@ -929,6 +929,13 @@ bool cac::createChannelIO (const char *pName, cacChannel &chan)
return true;
}
void cac::uninstallLocalChannel ( cacLocalChannelIO &localIO )
{
this->defaultMutex.lock ();
this->localChanList.remove ( localIO );
this->defaultMutex.unlock ();
}
bool cac::setupUDP ()
{
this->defaultMutex.lock ();

View File

@@ -23,10 +23,13 @@ cacChannelIO::~cacChannelIO ()
this->chan.pChannelIO = 0;
}
cacLocalChannelIO::cacLocalChannelIO ( cacChannel &chan ) :
cacChannelIO (chan) {};
cacLocalChannelIO::cacLocalChannelIO ( cac &cacCtxIn, cacChannel &chan ) :
cacChannelIO ( chan ), cacCtx ( cacCtxIn ) {};
cacLocalChannelIO::~cacLocalChannelIO () {}
cacLocalChannelIO::~cacLocalChannelIO ()
{
this->cacCtx.uninstallLocalChannel ( *this );
}
void cacChannelIO::connectNotify ()
{
@@ -60,9 +63,9 @@ channel_state cacChannelIO::state () const
caar cacChannelIO::accessRights () const
{
caar ar;
ar.read_access = true;
ar.write_access = true;
// static here avoids undefined memory read warning from
// error checking codes
static caar ar = { true, true };
return ar;
}

View File

@@ -21,6 +21,7 @@
#include "shareLib.h"
class cacNotifyIO;
class cac;
class epicsShareClass cacNotify {
public:
@@ -144,13 +145,15 @@ private:
class cacLocalChannelIO :
public cacChannelIO, public tsDLNode < cacLocalChannelIO > {
public:
epicsShareFunc cacLocalChannelIO ( cacChannel &chan );
epicsShareFunc virtual ~cacLocalChannelIO () = 0;
epicsShareFunc cacLocalChannelIO ( cac&, cacChannel &chan );
epicsShareFunc virtual ~cacLocalChannelIO ();
private:
cac &cacCtx;
};
struct cacServiceIO : public tsDLNode < cacServiceIO > {
public:
epicsShareFunc virtual cacLocalChannelIO *createChannelIO ( cacChannel &chan, const char *pName ) = 0;
epicsShareFunc virtual cacLocalChannelIO *createChannelIO ( const char *pName, cac &, cacChannel & ) = 0;
epicsShareFunc virtual void show ( unsigned level ) const = 0;
private:
};
@@ -159,7 +162,7 @@ class cacServiceList : private osiMutex {
public:
epicsShareFunc cacServiceList ();
epicsShareFunc void registerService ( cacServiceIO &service );
epicsShareFunc cacLocalChannelIO * createChannelIO ( const char *pName, cacChannel &chan );
epicsShareFunc cacLocalChannelIO * createChannelIO ( const char *pName, cac &, cacChannel & );
epicsShareFunc void show ( unsigned level ) const;
private:
tsDLList < cacServiceIO > services;

View File

@@ -30,14 +30,14 @@ void cacServiceList::registerService ( cacServiceIO &service )
this->unlock ();
}
cacLocalChannelIO * cacServiceList::createChannelIO (const char *pName, cacChannel &chan)
cacLocalChannelIO * cacServiceList::createChannelIO (const char *pName, cac &cacCtx, cacChannel &chan)
{
cacLocalChannelIO *pChanIO = 0;
this->lock ();
tsDLIterBD <cacServiceIO> iter ( this->services.first () );
while ( iter.valid () ) {
pChanIO = iter->createChannelIO ( chan, pName );
pChanIO = iter->createChannelIO ( pName, cacCtx, chan );
if ( pChanIO ) {
break;
}