From d727e229eb26ecbc3efd6f148036e695d506ab33 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Thu, 14 Sep 2000 00:33:35 +0000 Subject: [PATCH] proper cleanup of local channels --- src/ca/cac.cpp | 11 +++++++++-- src/ca/cacChannelIO.cpp | 15 +++++++++------ src/ca/cacIO.h | 11 +++++++---- src/ca/cacServiceList.cpp | 4 ++-- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ca/cac.cpp b/src/ca/cac.cpp index 35b53a879..76b9ddc8b 100644 --- a/src/ca/cac.cpp +++ b/src/ca/cac.cpp @@ -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 (); diff --git a/src/ca/cacChannelIO.cpp b/src/ca/cacChannelIO.cpp index a2d2d0b9c..9d6823312 100644 --- a/src/ca/cacChannelIO.cpp +++ b/src/ca/cacChannelIO.cpp @@ -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; } diff --git a/src/ca/cacIO.h b/src/ca/cacIO.h index 6b8326e8b..44051b1a2 100644 --- a/src/ca/cacIO.h +++ b/src/ca/cacIO.h @@ -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; diff --git a/src/ca/cacServiceList.cpp b/src/ca/cacServiceList.cpp index 03f9887d3..83a386639 100644 --- a/src/ca/cacServiceList.cpp +++ b/src/ca/cacServiceList.cpp @@ -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 iter ( this->services.first () ); while ( iter.valid () ) { - pChanIO = iter->createChannelIO ( chan, pName ); + pChanIO = iter->createChannelIO ( pName, cacCtx, chan ); if ( pChanIO ) { break; }