proper cleanup of local channels
This commit is contained in:
@@ -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 ();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user