diff --git a/src/ca/hostNameCache.h b/src/ca/hostNameCache.h index b29def436..9fbb6a0fc 100644 --- a/src/ca/hostNameCache.h +++ b/src/ca/hostNameCache.h @@ -39,14 +39,15 @@ # define epicsExportSharedSymbols #endif -class hostNameCache : public ipAddrToAsciiAsynchronous { +class hostNameCache : public ipAddrToAsciiCallBack { public: hostNameCache ( const osiSockAddr &addr, ipAddrToAsciiEngine &engine ); ~hostNameCache (); void destroy (); - void ioCompletionNotify ( const char *pHostName ); + void transactionComplete ( const char * pHostName ); void hostName ( char *pBuf, unsigned bufLength ) const; private: + ipAddrToAsciiTransaction & dnsTransaction; bool ioComplete; char hostNameBuf [128]; }; diff --git a/src/ca/msgForMultiplyDefinedPV.cpp b/src/ca/msgForMultiplyDefinedPV.cpp index 83ba2c03b..27c936667 100644 --- a/src/ca/msgForMultiplyDefinedPV.cpp +++ b/src/ca/msgForMultiplyDefinedPV.cpp @@ -38,9 +38,10 @@ #undef epicsExportSharedSymbols msgForMultiplyDefinedPV::msgForMultiplyDefinedPV ( - callbackForMultiplyDefinedPV & cbIn, const char * pChannelName, - const char * pAcc, const osiSockAddr &rej ) : - ipAddrToAsciiAsynchronous ( rej ), cb ( cbIn ) + ipAddrToAsciiEngine & engine, + callbackForMultiplyDefinedPV & cbIn, + const char * pChannelName, const char * pAcc ) : + dnsTransaction ( engine.createTransaction () ), cb ( cbIn ) { strncpy ( this->acc, pAcc, sizeof ( this->acc ) ); this->acc[ sizeof ( this->acc ) - 1 ] = '\0'; @@ -48,11 +49,15 @@ msgForMultiplyDefinedPV::msgForMultiplyDefinedPV ( this->channel[ sizeof ( this->channel ) - 1 ] = '\0'; } -void msgForMultiplyDefinedPV::ioCompletionNotify ( const char * pHostNameRej ) +msgForMultiplyDefinedPV::~msgForMultiplyDefinedPV () +{ + this->dnsTransaction.release (); +} + +void msgForMultiplyDefinedPV::transactionComplete ( const char * pHostNameRej ) { this->cb.pvMultiplyDefinedNotify ( *this, this->channel, this->acc, pHostNameRej ); - // dont touch this pointer after cb interfaces is called above because - // this object may no-longer exist! + // !! dont touch this pointer after this point because object has been deleted !! } void * msgForMultiplyDefinedPV::operator new ( size_t size, diff --git a/src/ca/msgForMultiplyDefinedPV.h b/src/ca/msgForMultiplyDefinedPV.h index e029b08f9..a452d2c02 100644 --- a/src/ca/msgForMultiplyDefinedPV.h +++ b/src/ca/msgForMultiplyDefinedPV.h @@ -39,22 +39,31 @@ public: const char * pAcc, const char * pRej ) = 0; }; -class msgForMultiplyDefinedPV : public ipAddrToAsciiAsynchronous { +class msgForMultiplyDefinedPV : public ipAddrToAsciiCallBack { public: - msgForMultiplyDefinedPV ( callbackForMultiplyDefinedPV &, - const char * pChannelName, const char * pAcc, const osiSockAddr & rej ); + msgForMultiplyDefinedPV ( ipAddrToAsciiEngine & engine, + callbackForMultiplyDefinedPV &, const char * pChannelName, + 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]; + ipAddrToAsciiTransaction & dnsTransaction; callbackForMultiplyDefinedPV & cb; - void ioCompletionNotify ( const char *pHostName ); + void transactionComplete ( const char * pHostName ); msgForMultiplyDefinedPV ( const msgForMultiplyDefinedPV & ); msgForMultiplyDefinedPV & operator = ( const msgForMultiplyDefinedPV & ); void * operator new ( size_t size ); void operator delete ( void * ); }; +inline void msgForMultiplyDefinedPV::ioInitiate ( const osiSockAddr & rej ) +{ + this->dnsTransaction.ipAddrToAscii ( rej, *this ); +} + #endif // ifdef msgForMultiplyDefinedPVh