diff --git a/src/ca/client/cac.cpp b/src/ca/client/cac.cpp index 9d23cce..92b303a 100644 --- a/src/ca/client/cac.cpp +++ b/src/ca/client/cac.cpp @@ -281,6 +281,13 @@ cac::~cac () { epicsGuard < epicsMutex > cbGuard ( this->cbMutex ); epicsGuard < epicsMutex > guard ( this->mutex ); + for(std::set::iterator it = mdpvList.begin(), end = mdpvList.end(); + it != end; ++it) + { + delete *it; + } + mdpvList.clear(); + if ( this->pudpiiu ) { this->pudpiiu->shutdown ( cbGuard, guard ); @@ -603,9 +610,10 @@ void cac::transferChanToVirtCircuit ( if ( ! sockAddrAreIdentical ( &addr, &chanAddr ) ) { char acc[64]; pChan->getPIIU(guard)->getHostName ( guard, acc, sizeof ( acc ) ); - msgForMultiplyDefinedPV * pMsg = new ( this->mdpvFreeList ) + msgForMultiplyDefinedPV * pMsg = new msgForMultiplyDefinedPV ( this->ipToAEngine, *this, pChan->pName ( guard ), acc ); + mdpvList.insert(pMsg); // It is possible for the ioInitiate call below to // call the callback directly if queue quota is exceeded. // This callback takes the callback lock and therefore we @@ -1297,8 +1305,8 @@ void cac::pvMultiplyDefinedNotify ( msgForMultiplyDefinedPV & mfmdpv, epicsGuard < epicsMutex > guard ( this->mutex ); this->exception ( mgr.cbGuard, guard, ECA_DBLCHNL, buf, __FILE__, __LINE__ ); } - mfmdpv.~msgForMultiplyDefinedPV (); - this->mdpvFreeList.release ( & mfmdpv ); + mdpvList.erase(&mfmdpv); + delete &mfmdpv; } void cac::registerSearchDest ( diff --git a/src/ca/client/cac.h b/src/ca/client/cac.h index 9f9d45a..cc23901 100644 --- a/src/ca/client/cac.h +++ b/src/ca/client/cac.h @@ -22,6 +22,8 @@ #ifndef cach #define cach +#include + #ifdef epicsExportSharedSymbols # define cach_restore_epicsExportSharedSymbols # undef epicsExportSharedSymbols @@ -252,9 +254,7 @@ private: tsFreeList < class nciu, 1024, epicsMutexNOOP > channelFreeList; - tsFreeList - < class msgForMultiplyDefinedPV, 16 > - mdpvFreeList; + std::set mdpvList; cacComBufMemoryManager comBufMemMgr; bheFreeStore bheFreeList; epicsTime programBeginTime; diff --git a/src/ca/client/msgForMultiplyDefinedPV.cpp b/src/ca/client/msgForMultiplyDefinedPV.cpp index 2f1a45c..59544e0 100644 --- a/src/ca/client/msgForMultiplyDefinedPV.cpp +++ b/src/ca/client/msgForMultiplyDefinedPV.cpp @@ -59,31 +59,6 @@ void msgForMultiplyDefinedPV::transactionComplete ( const char * pHostNameRej ) // !! dont touch this pointer after this point because object has been deleted !! } -void * msgForMultiplyDefinedPV::operator new ( size_t size, - tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList ) -{ - return freeList.allocate ( size ); -} - -#ifdef CXX_PLACEMENT_DELETE -void msgForMultiplyDefinedPV::operator delete ( void *pCadaver, - tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList ) -{ - freeList.release ( pCadaver, sizeof ( msgForMultiplyDefinedPV ) ); -} -#endif - -void msgForMultiplyDefinedPV::operator delete ( void * ) -{ - // Visual C++ .net appears to require operator delete if - // placement operator delete is defined? I smell a ms rat - // because if I declare placement new and delete, but - // comment out the placement delete definition there are - // no undefined symbols. - errlogPrintf ( "%s:%d this compiler is confused about placement delete - memory was probably leaked", - __FILE__, __LINE__ ); -} - callbackForMultiplyDefinedPV::~callbackForMultiplyDefinedPV () { } diff --git a/src/ca/client/msgForMultiplyDefinedPV.h b/src/ca/client/msgForMultiplyDefinedPV.h index 45d3453..1ce8013 100644 --- a/src/ca/client/msgForMultiplyDefinedPV.h +++ b/src/ca/client/msgForMultiplyDefinedPV.h @@ -54,8 +54,6 @@ public: const char * pAcc ); virtual ~msgForMultiplyDefinedPV (); void ioInitiate ( const osiSockAddr & rej ); - void * operator new ( size_t size, tsFreeList < class msgForMultiplyDefinedPV, 16 > & ); - epicsPlacementDeleteOperator (( void *, tsFreeList < class msgForMultiplyDefinedPV, 16 > & )) private: char acc[64]; char channel[64]; @@ -63,8 +61,7 @@ private: callbackForMultiplyDefinedPV & cb; void transactionComplete ( const char * pHostName ); msgForMultiplyDefinedPV ( const msgForMultiplyDefinedPV & ); - msgForMultiplyDefinedPV & operator = ( const msgForMultiplyDefinedPV & ); - void operator delete ( void * ); + msgForMultiplyDefinedPV & operator = ( const msgForMultiplyDefinedPV & ); }; inline void msgForMultiplyDefinedPV::ioInitiate ( const osiSockAddr & rej ) diff --git a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp index cef728f..bfffeaa 100644 --- a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp +++ b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp @@ -50,10 +50,6 @@ public: virtual ~ipAddrToAsciiTransactionPrivate (); osiSockAddr address () const; void show ( unsigned level ) const; - void * operator new ( size_t size, tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 > & ); - epicsPlacementDeleteOperator (( void *, tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 > & )) private: osiSockAddr addr; ipAddrToAsciiEnginePrivate & engine; @@ -61,24 +57,11 @@ private: bool pending; void ipAddrToAscii ( const osiSockAddr &, ipAddrToAsciiCallBack & ); void release (); - void operator delete ( void * ); friend class ipAddrToAsciiEnginePrivate; ipAddrToAsciiTransactionPrivate & operator = ( const ipAddrToAsciiTransactionPrivate & ); ipAddrToAsciiTransactionPrivate ( const ipAddrToAsciiTransactionPrivate & ); }; -#ifdef _MSC_VER -# pragma warning ( push ) -# pragma warning ( disable:4660 ) -#endif - -template class tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 >; - -#ifdef _MSC_VER -# pragma warning ( pop ) -#endif - extern "C" { static void ipAddrToAsciiEngineGlobalMutexConstruct ( void * ); } @@ -94,9 +77,6 @@ public: void show ( unsigned level ) const; private: char nameTmp [1024]; - tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 > - transactionFreeList; tsDLList < ipAddrToAsciiTransactionPrivate > labor; mutable epicsMutex mutex; epicsEvent laborEvent; @@ -199,35 +179,10 @@ void ipAddrToAsciiEnginePrivate::show ( unsigned level ) const } } -inline void * ipAddrToAsciiTransactionPrivate::operator new ( size_t size, tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 > & freeList ) -{ - return freeList.allocate ( size ); -} - -#ifdef CXX_PLACEMENT_DELETE -inline void ipAddrToAsciiTransactionPrivate::operator delete ( void * pTrans, tsFreeList - < ipAddrToAsciiTransactionPrivate, 0x80 > & freeList ) -{ - freeList.release ( pTrans ); -} -#endif - -void ipAddrToAsciiTransactionPrivate::operator delete ( void * ) -{ - // Visual C++ .net appears to require operator delete if - // placement operator delete is defined? I smell a ms rat - // because if I declare placement new and delete, but - // comment out the placement delete definition there are - // no undefined symbols. - errlogPrintf ( "%s:%d this compiler is confused about placement delete - memory was probably leaked", - __FILE__, __LINE__ ); -} - ipAddrToAsciiTransaction & ipAddrToAsciiEnginePrivate::createTransaction () { - return * new ( this->transactionFreeList ) ipAddrToAsciiTransactionPrivate ( *this ); + return * new ipAddrToAsciiTransactionPrivate ( *this ); } void ipAddrToAsciiEnginePrivate::run () @@ -296,8 +251,7 @@ ipAddrToAsciiTransactionPrivate::ipAddrToAsciiTransactionPrivate void ipAddrToAsciiTransactionPrivate::release () { - this->~ipAddrToAsciiTransactionPrivate (); - this->engine.transactionFreeList.release ( this ); + delete this; } ipAddrToAsciiTransactionPrivate::~ipAddrToAsciiTransactionPrivate ()