From 87aca7838ef3a9e8d4213e0ff821b56a2b05bc7d Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 12 Feb 2003 23:54:34 +0000 Subject: [PATCH] optimizations --- src/cas/generic/caServerIIL.h | 2 +- src/cas/generic/casAsyncReadIOI.cc | 4 +- src/cas/generic/casCoreClient.cc | 8 +- src/cas/generic/casCoreClient.h | 8 +- src/cas/generic/casCoreClientIL.h | 2 +- src/cas/generic/casMonEvent.cc | 2 +- src/cas/generic/casMonEvent.h | 1 + src/cas/generic/casMonitor.cc | 8 +- src/cas/generic/casMonitor.h | 6 +- src/cas/generic/casStrmClient.cc | 236 ++++++++++++++--------------- src/cas/generic/casStrmClient.h | 16 +- src/cas/generic/casdef.h | 1 - src/cas/generic/outBuf.cc | 62 ++++---- 13 files changed, 174 insertions(+), 182 deletions(-) diff --git a/src/cas/generic/caServerIIL.h b/src/cas/generic/caServerIIL.h index 956230b91..c0d08a886 100644 --- a/src/cas/generic/caServerIIL.h +++ b/src/cas/generic/caServerIIL.h @@ -137,7 +137,7 @@ inline void caServerI::unlock () const } inline casMonEvent & caServerI::casMonEventFactory ( casMonitor & monitor, - const smartConstGDDPointer & pNewValue ) + const gdd & pNewValue ) { return * new ( this->casMonEventFreeList ) casMonEvent ( monitor, pNewValue ); } diff --git a/src/cas/generic/casAsyncReadIOI.cc b/src/cas/generic/casAsyncReadIOI.cc index 9af1e699f..243e7c646 100644 --- a/src/cas/generic/casAsyncReadIOI.cc +++ b/src/cas/generic/casAsyncReadIOI.cc @@ -63,13 +63,13 @@ caStatus casAsyncReadIOI::cbFuncAsyncIO () case CA_PROTO_READ_NOTIFY: status = client.readNotifyResponse ( &this->chan, - this->msg, this->pDD, + this->msg, *this->pDD, this->completionStatus); break; case CA_PROTO_EVENT_ADD: status = client.monitorResponse ( this->chan, - this->msg, this->pDD, + this->msg, *this->pDD, this->completionStatus); break; diff --git a/src/cas/generic/casCoreClient.cc b/src/cas/generic/casCoreClient.cc index 6bc0427d6..3af1e580c 100644 --- a/src/cas/generic/casCoreClient.cc +++ b/src/cas/generic/casCoreClient.cc @@ -70,12 +70,12 @@ caStatus casCoreClient::createChanResponse ( const caHdrLargeArray &, const pvAt return S_casApp_noSupport; } caStatus casCoreClient::readResponse ( casChannelI *, const caHdrLargeArray &, - const smartConstGDDPointer &, const caStatus ) + const gdd &, const caStatus ) { return S_casApp_noSupport; } caStatus casCoreClient::readNotifyResponse ( casChannelI *, const caHdrLargeArray &, - const smartConstGDDPointer &, const caStatus ) + const gdd &, const caStatus ) { return S_casApp_noSupport; } @@ -90,7 +90,7 @@ caStatus casCoreClient::writeNotifyResponse ( casChannelI &, return S_casApp_noSupport; } caStatus casCoreClient::monitorResponse ( casChannelI &, const caHdrLargeArray &, - const smartConstGDDPointer &, const caStatus ) + const gdd &, const caStatus ) { return S_casApp_noSupport; } @@ -132,7 +132,7 @@ void casCoreClient::eventSignal() } caStatus casCoreClient::casMonitorCallBack ( casMonitor &, - const smartConstGDDPointer & ) + const gdd & ) { return S_cas_internal; } diff --git a/src/cas/generic/casCoreClient.h b/src/cas/generic/casCoreClient.h index 5e9a943ae..f833fb94f 100644 --- a/src/cas/generic/casCoreClient.h +++ b/src/cas/generic/casCoreClient.h @@ -57,16 +57,16 @@ public: const caHdrLargeArray &, const pvAttachReturn &); virtual caStatus readResponse ( casChannelI *, const caHdrLargeArray &, - const smartConstGDDPointer &, const caStatus ); + const gdd &, const caStatus ); virtual caStatus readNotifyResponse ( casChannelI *, const caHdrLargeArray &, - const smartConstGDDPointer &, const caStatus ); + const gdd &, const caStatus ); virtual caStatus writeResponse ( casChannelI &, const caHdrLargeArray &, const caStatus ); virtual caStatus writeNotifyResponse ( casChannelI &, const caHdrLargeArray &, const caStatus ); virtual caStatus monitorResponse ( casChannelI &, - const caHdrLargeArray &, const smartConstGDDPointer &, + const caHdrLargeArray &, const gdd &, const caStatus status ); virtual caStatus accessRightsResponse ( casChannelI * ); virtual caStatus enumPostponedCreateChanResponse ( @@ -97,7 +97,7 @@ public: void enableEvents (); void disableEvents (); caStatus casMonitorCallBack ( casMonitor &, - const smartConstGDDPointer & ); + const gdd & ); void postEvent ( tsDLList &, const casEventMask &select, const gdd &event ); diff --git a/src/cas/generic/casCoreClientIL.h b/src/cas/generic/casCoreClientIL.h index c250bc8dc..4bef1eae7 100644 --- a/src/cas/generic/casCoreClientIL.h +++ b/src/cas/generic/casCoreClientIL.h @@ -51,7 +51,7 @@ inline bool casCoreClient::okToStartAsynchIO () } inline casMonEvent & casCoreClient::casMonEventFactory ( casMonitor & monitor, - const smartConstGDDPointer & pNewValue ) + const gdd & pNewValue ) { return this->ctx.getServer()->casMonEventFactory ( monitor, pNewValue ); } diff --git a/src/cas/generic/casMonEvent.cc b/src/cas/generic/casMonEvent.cc index 49eb5f934..fe15a2e5b 100644 --- a/src/cas/generic/casMonEvent.cc +++ b/src/cas/generic/casMonEvent.cc @@ -26,7 +26,7 @@ caStatus casMonEvent::cbFunc ( casCoreClient & client, epicsGuard < epicsMutex > & guard ) { return this->monitor.executeEvent ( - client, * this, this->pValue, guard ); + client, * this, *this->pValue, guard ); } void casMonEvent::assign ( const gdd & valueIn ) diff --git a/src/cas/generic/casMonEvent.h b/src/cas/generic/casMonEvent.h index 424b5cd13..cf0055f3b 100644 --- a/src/cas/generic/casMonEvent.h +++ b/src/cas/generic/casMonEvent.h @@ -25,6 +25,7 @@ #endif #include "tsFreeList.h" +#include "smartGDDPointer.h" #ifdef epicsExportSharedSymbols_casMonEventh # define epicsExportSharedSymbols diff --git a/src/cas/generic/casMonitor.cc b/src/cas/generic/casMonitor.cc index f7decd041..31ff47530 100644 --- a/src/cas/generic/casMonitor.cc +++ b/src/cas/generic/casMonitor.cc @@ -46,7 +46,7 @@ casMonitor::~casMonitor() } caStatus casMonitor::response ( casCoreClient & client, - const smartConstGDDPointer & value ) + const gdd & value ) { if ( this->pChannel ) { // reconstruct request header @@ -101,15 +101,13 @@ void casMonitor::installNewEventLog ( } caStatus casMonitor::executeEvent ( casCoreClient & client, - casMonEvent & ev, smartConstGDDPointer & pValue, + casMonEvent & ev, const gdd & value, epicsGuard < epicsMutex > & guard ) { - assert ( pValue.valid() ); - if ( this->pChannel ) { epicsGuardRelease < epicsMutex > unguard ( guard ); caStatus status = this->callBackIntf.casMonitorCallBack ( - *this, pValue ); + *this, value ); if ( status != S_cas_success ) { return status; } diff --git a/src/cas/generic/casMonitor.h b/src/cas/generic/casMonitor.h index 56730f93f..4d409e194 100644 --- a/src/cas/generic/casMonitor.h +++ b/src/cas/generic/casMonitor.h @@ -39,7 +39,7 @@ class casMonitorCallbackInterface { // X aCC 655 public: virtual caStatus casMonitorCallBack ( class casMonitor &, - const smartConstGDDPointer & pValue ) = 0; + const gdd & ) = 0; }; class casEvent; @@ -56,11 +56,11 @@ public: tsDLList < casEvent > & eventLogQue, casMonEvent * pLog, const gdd & event ); caStatus response ( casCoreClient & client, - const smartConstGDDPointer & value ); + const gdd & value ); void show ( unsigned level ) const; bool selected ( const casEventMask & select ) const; caStatus executeEvent ( casCoreClient &, - casMonEvent &, smartConstGDDPointer &, + casMonEvent &, const gdd &, epicsGuard < epicsMutex > & ); bool matchingClientId ( caResId clientIdIn ) const; unsigned numEventsQueued () const; diff --git a/src/cas/generic/casStrmClient.cc b/src/cas/generic/casStrmClient.cc index 0193d33bb..f4c7769d7 100644 --- a/src/cas/generic/casStrmClient.cc +++ b/src/cas/generic/casStrmClient.cc @@ -143,10 +143,10 @@ void casStrmClient::show ( unsigned level ) const */ caStatus casStrmClient::readAction () { - const caHdrLargeArray *mp = this->ctx.getMsg(); + const caHdrLargeArray * mp = this->ctx.getMsg(); caStatus status; - casChannelI *pChan; - smartGDDPointer pDesc; + casChannelI * pChan; + const gdd * pDesc; status = this->verifyRequest ( pChan ); if ( status != ECA_NORMAL ) { @@ -193,6 +193,10 @@ caStatus casStrmClient::readAction () pChan->getCID(), status, ECA_GETFAIL ); } + if ( pDesc ) { + pDesc->unreference (); + } + return status; } @@ -200,7 +204,7 @@ caStatus casStrmClient::readAction () // casStrmClient::readResponse() // caStatus casStrmClient::readResponse ( casChannelI * pChan, const caHdrLargeArray & msg, - const smartConstGDDPointer & pDesc, const caStatus status ) + const gdd & desc, const caStatus status ) { if ( status != S_casApp_success ) { return this->sendErrWithEpicsStatus ( & msg, @@ -229,9 +233,9 @@ caStatus casStrmClient::readResponse ( casChannelI * pChan, const caHdrLargeArra // (places the data in network format) // int mapDBRStatus = gddMapDbr[msg.m_dataType].conv_dbr( - pPayload, msg.m_count, *pDesc, pChan->enumStringTable() ); + pPayload, msg.m_count, desc, pChan->enumStringTable() ); if ( mapDBRStatus < 0 ) { - pDesc->dump (); + desc.dump (); errPrintf ( S_cas_badBounds, __FILE__, __LINE__, "- get with PV=%s type=%u count=%u", pChan->getPVI().getName(), msg.m_dataType, msg.m_count ); return this->sendErrWithEpicsStatus ( @@ -258,9 +262,9 @@ caStatus casStrmClient::readResponse ( casChannelI * pChan, const caHdrLargeArra caStatus casStrmClient::readNotifyAction () { const caHdrLargeArray * mp = this->ctx.getMsg(); - int status; casChannelI * pChan; - smartGDDPointer pDesc; + const gdd * pDesc; + int status; status = this->verifyRequest ( pChan ); if ( status != ECA_NORMAL ) { @@ -271,17 +275,12 @@ caStatus casStrmClient::readNotifyAction () // verify read access // if ( ! pChan->readAccess() ) { - if ( CA_V41 ( this->minor_version_number ) ) { - return this->readNotifyFailureResponse ( *mp, ECA_NORDACCESS ); - } - else { - return this->readNotifyResponse ( NULL, *mp, NULL, S_cas_noRead ); - } + return this->readNotifyFailureResponse ( *mp, ECA_NORDACCESS ); } status = this->read ( pDesc ); if ( status == S_casApp_success ) { - status = this->readNotifyResponse ( pChan, *mp, pDesc, status ); + status = this->readNotifyResponse ( pChan, *mp, *pDesc, status ); } else if ( status == S_casApp_asyncCompletion ) { status = S_cas_success; @@ -290,9 +289,13 @@ caStatus casStrmClient::readNotifyAction () pChan->getPVI().addItemToIOBLockedList ( *this ); } else { - status = this->readNotifyResponse ( pChan, *mp, pDesc, status ); + status = this->readNotifyResponse ( pChan, *mp, *pDesc, status ); } + if ( pDesc ) { + pDesc->unreference (); + } + return status; } @@ -300,7 +303,7 @@ caStatus casStrmClient::readNotifyAction () // casStrmClient::readNotifyResponse() // caStatus casStrmClient::readNotifyResponse ( casChannelI * pChan, - const caHdrLargeArray & msg, const smartConstGDDPointer & pDesc, + const caHdrLargeArray & msg, const gdd & desc, const caStatus completionStatus ) { if ( completionStatus != S_cas_success ) { @@ -326,12 +329,6 @@ caStatus casStrmClient::readNotifyResponse ( casChannelI * pChan, return ecaStatus; } - if ( ! pDesc ) { - errMessage ( S_cas_badParameter, - "no data in server tool asynch read resp ?" ); - return this->readNotifyFailureResponse ( msg, ECA_GETFAIL ); - } - epicsGuard < epicsMutex > guard ( this->mutex ); void *pPayload; @@ -353,9 +350,9 @@ caStatus casStrmClient::readNotifyResponse ( casChannelI * pChan, // convert gdd to db_access type // int mapDBRStatus = gddMapDbr[msg.m_dataType].conv_dbr ( pPayload, - msg.m_count, *pDesc, pChan->enumStringTable() ); + msg.m_count, desc, pChan->enumStringTable() ); if ( mapDBRStatus < 0 ) { - pDesc->dump(); + desc.dump(); errPrintf ( S_cas_badBounds, __FILE__, __LINE__, "- get notify with PV=%s type=%u count=%u", pChan->getPVI().getName(), msg.m_dataType, msg.m_count ); @@ -448,7 +445,7 @@ bool convertContainerMemberToAtomic ( gdd & dd, // // createDBRDD () // -static smartGDDPointer createDBRDD ( unsigned dbrType, unsigned elemCount ) +static gdd * createDBRDD ( unsigned dbrType, unsigned elemCount ) { /* * DBR type has already been checked, but it is possible @@ -456,11 +453,11 @@ static smartGDDPointer createDBRDD ( unsigned dbrType, unsigned elemCount ) * the DBR_XXXX type system */ if ( dbrType >= NELEMENTS ( gddDbrToAit ) ) { - return smartGDDPointer (); + return 0; } if ( gddDbrToAit[dbrType].type == aitEnumInvalid ) { - return smartGDDPointer (); + return 0; } aitUint16 appType = gddDbrToAit[dbrType].app; @@ -468,16 +465,12 @@ static smartGDDPointer createDBRDD ( unsigned dbrType, unsigned elemCount ) // // create the descriptor // - smartGDDPointer pDescRet = + gdd * pDescRet = gddApplicationTypeTable::app_table.getDD ( appType ); - if ( ! pDescRet.valid () ) { + if ( ! pDescRet ) { return pDescRet; } - // smart pointer class maintains the ref count from here down - aitUint32 gddStatus = pDescRet->unreference(); - assert ( ! gddStatus ); - // fix the value element count bool success = convertContainerMemberToAtomic ( *pDescRet, gddAppType_value, elemCount ); @@ -523,10 +516,11 @@ caStatus casStrmClient::monitorFailureResponse ( const caHdrLargeArray & msg, // casStrmClient::monitorResponse () // caStatus casStrmClient::monitorResponse ( casChannelI & chan, const caHdrLargeArray & msg, - const smartConstGDDPointer & pDesc, const caStatus completionStatus ) + const gdd & desc, const caStatus completionStatus ) { epicsGuard < epicsMutex > guard ( this->mutex ); - void * pPayload; + + void * pPayload = 0; { ca_uint32_t size = dbr_size_n ( msg.m_dataType, msg.m_count ); caStatus status = out.copyInHeader ( msg.m_cmmd, size, @@ -542,29 +536,27 @@ caStatus casStrmClient::monitorResponse ( casChannelI & chan, const caHdrLargeAr } } - smartGDDPointer pDBRDD; if ( ! chan.readAccess () ) { return monitorFailureResponse ( msg, ECA_NORDACCESS ); } - else if ( completionStatus == S_cas_success ) { + + gdd * pDBRDD = 0; + if ( completionStatus == S_cas_success ) { pDBRDD = createDBRDD ( msg.m_dataType, msg.m_count ); if ( ! pDBRDD ) { return monitorFailureResponse ( msg, ECA_ALLOCMEM ); } - else if ( pDesc.valid() ) { + else { gddStatus gdds = gddApplicationTypeTable:: - app_table.smartCopy ( & (*pDBRDD), & (*pDesc) ); + app_table.smartCopy ( pDBRDD, & desc ); if ( gdds < 0 ) { + pDBRDD->unreference (); errPrintf ( S_cas_noConvert, __FILE__, __LINE__, "no conversion between event app type=%d and DBR type=%d Element count=%d", - pDesc->applicationType (), msg.m_dataType, msg.m_count); + desc.applicationType (), msg.m_dataType, msg.m_count); return monitorFailureResponse ( msg, ECA_NOCONVERT ); } } - else { - errMessage ( S_cas_badParameter, "no GDD in monitor response ?" ); - return monitorFailureResponse ( msg, ECA_GETFAIL ); - } } else { errMessage ( completionStatus, "- in monitor response" ); @@ -582,6 +574,7 @@ caStatus casStrmClient::monitorResponse ( casChannelI & chan, const caHdrLargeAr int mapDBRStatus = gddMapDbr[msg.m_dataType].conv_dbr ( pPayload, msg.m_count, *pDBRDD, chan.enumStringTable() ); if ( mapDBRStatus < 0 ) { + pDBRDD->unreference (); return monitorFailureResponse ( msg, ECA_NOCONVERT ); } @@ -590,6 +583,7 @@ caStatus casStrmClient::monitorResponse ( casChannelI & chan, const caHdrLargeAr (* cac_dbr_cvrt[msg.m_dataType]) ( pPayload, pPayload, true, msg.m_count ); #endif + // // force string message size to be the true size // @@ -601,6 +595,8 @@ caStatus casStrmClient::monitorResponse ( casChannelI & chan, const caHdrLargeAr this->out.commitMsg (); } + pDBRDD->unreference (); + return S_cas_success; } @@ -1284,7 +1280,7 @@ caStatus casStrmClient::eventAddAction () // to postpone asynchronous IO we can safely restart this // request later. // - smartGDDPointer pDD; + const gdd * pDD; status = this->read ( pDD ); // // always send immediate monitor response at event add @@ -1300,7 +1296,7 @@ caStatus casStrmClient::eventAddAction () } else { status = this->monitorResponse ( *pciu, - *mp, pDD, status ); + *mp, *pDD, status ); } if ( status == S_cas_success ) { @@ -1310,6 +1306,10 @@ caStatus casStrmClient::eventAddAction () pciu->installMonitor ( mon ); } + if ( pDD ) { + pDD->unreference (); + } + return status; } @@ -1620,11 +1620,7 @@ caStatus casStrmClient::write() // caStatus casStrmClient::writeScalarData () { - smartGDDPointer pDD; const caHdrLargeArray * pHdr = this->ctx.getMsg (); - gddStatus gddStat; - caStatus status; - aitEnum type; /* * DBR type has already been checked, but it is possible @@ -1634,52 +1630,52 @@ caStatus casStrmClient::writeScalarData () if ( pHdr->m_dataType >= NELEMENTS(gddDbrToAit) ) { return S_cas_badType; } - type = gddDbrToAit[pHdr->m_dataType].type; + aitEnum type = gddDbrToAit[pHdr->m_dataType].type; if ( type == aitEnumInvalid ) { return S_cas_badType; } aitEnum bestExternalType = this->ctx.getPV()->bestExternalType (); - pDD = new gddScalar (gddAppType_value, bestExternalType); - if (!pDD) { + gdd * pDD = new gddScalar ( gddAppType_value, bestExternalType ); + if ( ! pDD ) { return S_cas_noMemory; } - // - // reference count is managed by smart pointer class - // from here down - // - gddStat = pDD->unreference(); - assert (!gddStat); - // // copy in, and convert to native type, the incoming data // - gddStat = aitConvert (pDD->primitiveType(), pDD->dataAddress(), type, - this->ctx.getData(), 1, &this->ctx.getPV()->enumStringTable()); - if (gddStat<0) { - status = S_cas_noConvert; - } - else { + gddStatus gddStat = aitConvert ( + pDD->primitiveType(), pDD->dataAddress(), type, + this->ctx.getData(), 1, &this->ctx.getPV()->enumStringTable() ); + caStatus status = S_cas_noConvert; + if ( gddStat >= 0 ) { // // set the status and severity to normal // - pDD->setStat (epicsAlarmNone); - pDD->setSevr (epicsSevNone); + pDD->setStat ( epicsAlarmNone ); + pDD->setSevr ( epicsSevNone ); // // set the time stamp to the last time that // we added bytes to the in buf // aitTimeStamp gddts = this->lastRecvTS; - pDD->setTimeStamp (&gddts); + pDD->setTimeStamp ( & gddts ); // // call the server tool's virtual function // - status = this->ctx.getPV()->write (this->ctx, *pDD); + status = this->ctx.getPV()->write ( this->ctx, *pDD ); } + + // + // reference count is managed by smart pointer class + // from here down + // + gddStat = pDD->unreference(); + assert ( ! gddStat ); + return status; } @@ -1688,44 +1684,32 @@ caStatus casStrmClient::writeScalarData () // caStatus casStrmClient::writeArrayData() { - smartGDDPointer pDD; - const caHdrLargeArray *pHdr = this->ctx.getMsg(); - gddDestructor *pDestructor; - gddStatus gddStat; - caStatus status; - aitEnum type; - char *pData; - size_t size; + const caHdrLargeArray *pHdr = this->ctx.getMsg (); /* * DBR type has already been checked, but it is possible * that "gddDbrToAit" will not track with changes in * the DBR_XXXX type system */ - if (pHdr->m_dataType>=NELEMENTS(gddDbrToAit)) { + if ( pHdr->m_dataType >= NELEMENTS(gddDbrToAit) ) { return S_cas_badType; } - type = gddDbrToAit[pHdr->m_dataType].type; - if (type==aitEnumInvalid) { + aitEnum type = gddDbrToAit[pHdr->m_dataType].type; + if ( type == aitEnumInvalid ) { return S_cas_badType; } aitEnum bestExternalType = this->ctx.getPV()->bestExternalType (); - pDD = new gddAtomic(gddAppType_value, bestExternalType, 1, pHdr->m_count); - if (!pDD) { + gdd * pDD = new gddAtomic(gddAppType_value, bestExternalType, 1, pHdr->m_count); + if ( ! pDD ) { return S_cas_noMemory; } - // - // GDD ref count is managed by smart pointer class from here down - // - gddStat = pDD->unreference(); - assert (!gddStat); - - size = aitSize[bestExternalType] * pHdr->m_count; - pData = new char [size]; - if (!pData) { + size_t size = aitSize[bestExternalType] * pHdr->m_count; + char * pData = new char [size]; + if ( ! pData ) { + pDD->unreference(); return S_cas_noMemory; } @@ -1733,60 +1717,64 @@ caStatus casStrmClient::writeArrayData() // ok to use the default gddDestructor here because // an array of characters was allocated above // - pDestructor = new gddDestructor; - if (!pDestructor) { + gddDestructor * pDestructor = new gddDestructor; + if ( ! pDestructor ) { + pDD->unreference(); delete [] pData; return S_cas_noMemory; } + // + // install allocated area into the DD + // + pDD->putRef ( pData, type, pDestructor ); + // // convert the data from the protocol buffer // to the allocated area so that they // will be allowed to ref the DD // - gddStat = aitConvert (bestExternalType, pData, type, this->ctx.getData(), + caStatus status = S_cas_noConvert; + gddStatus gddStat = aitConvert ( bestExternalType, + pData, type, this->ctx.getData(), pHdr->m_count, &this->ctx.getPV()->enumStringTable() ); - if (gddStat<0) { - status = S_cas_noConvert; - delete pDestructor; - delete [] pData; - } - else { - // - // install allocated area into the DD - // - pDD->putRef (pData, type, pDestructor); - + if ( gddStat >= 0 ) { // // set the status and severity to normal // - pDD->setStat (epicsAlarmNone); - pDD->setSevr (epicsSevNone); + pDD->setStat ( epicsAlarmNone ); + pDD->setSevr ( epicsSevNone ); // // set the time stamp to the last time that // we added bytes to the in buf // aitTimeStamp gddts = this->lastRecvTS; - pDD->setTimeStamp (&gddts); + pDD->setTimeStamp ( & gddts ); // // call the server tool's virtual function // - status = this->ctx.getPV()->write(this->ctx, *pDD); + status = this->ctx.getPV()->write ( this->ctx, *pDD ); } + + gddStat = pDD->unreference (); + assert ( ! gddStat ); + return status; } // // casStrmClient::read() // -caStatus casStrmClient::read ( smartGDDPointer & pDescRet ) +caStatus casStrmClient::read ( const gdd * & pDescRet ) { const caHdrLargeArray * pHdr = this->ctx.getMsg(); - pDescRet = createDBRDD ( pHdr->m_dataType, pHdr->m_count ); - if ( ! pDescRet ) { + pDescRet = 0; + + gdd * pDD = createDBRDD ( pHdr->m_dataType, pHdr->m_count ); + if ( ! pDD ) { return S_cas_noMemory; } @@ -1794,7 +1782,8 @@ caStatus casStrmClient::read ( smartGDDPointer & pDescRet ) // the PV state must not be modified during a transaction // caStatus status = this->ctx.getPV()->beginTransaction(); - if (status) { + if ( status ) { + pDD->unreference (); return status; } @@ -1806,7 +1795,9 @@ caStatus casStrmClient::read ( smartGDDPointer & pDescRet ) // // call the server tool's virtual function // - status = this->ctx.getPV()->read (this->ctx, *pDescRet); + status = this->ctx.getPV()->read ( this->ctx, * pDD ); + + this->ctx.getPV()->endTransaction(); // // prevent problems when they initiate @@ -1814,7 +1805,7 @@ caStatus casStrmClient::read ( smartGDDPointer & pDescRet ) // indicating so (and vise versa) // if ( this->userStartedAsyncIO ) { - if (status!=S_casApp_asyncCompletion) { + if ( status != S_casApp_asyncCompletion ) { fprintf(stderr, "Application returned %d from casPV::read() - expected S_casApp_asyncCompletion\n", status); @@ -1827,11 +1818,12 @@ caStatus casStrmClient::read ( smartGDDPointer & pDescRet ) "- expected asynch IO creation from casPV::read()"); } - if ( status ) { - pDescRet = NULL; + if ( status == S_casApp_success ) { + pDescRet = pDD; } - - this->ctx.getPV()->endTransaction(); + else { + pDD->unreference (); + } return status; } @@ -1938,7 +1930,7 @@ void casStrmClient::flush () // casStrmClient::casMonitorCallBack() // caStatus casStrmClient::casMonitorCallBack ( - casMonitor & mon, const smartConstGDDPointer & value ) + casMonitor & mon, const gdd & value ) { return mon.response ( *this, value ); } diff --git a/src/cas/generic/casStrmClient.h b/src/cas/generic/casStrmClient.h index cf795938a..55ea50e32 100644 --- a/src/cas/generic/casStrmClient.h +++ b/src/cas/generic/casStrmClient.h @@ -34,16 +34,16 @@ public: // virtual caStatus createChanResponse ( const caHdrLargeArray &, const pvAttachReturn & ); - caStatus readResponse ( casChannelI *pChan, const caHdrLargeArray &msg, - const smartConstGDDPointer &pDesc, const caStatus status); - caStatus readNotifyResponse ( casChannelI *pChan, const caHdrLargeArray &msg, - const smartConstGDDPointer &pDesc, const caStatus status); + caStatus readResponse ( casChannelI * pChan, const caHdrLargeArray & msg, + const gdd & desc, const caStatus status ); + caStatus readNotifyResponse ( casChannelI *pChan, const caHdrLargeArray & msg, + const gdd & desc, const caStatus status ); caStatus writeResponse ( casChannelI &, const caHdrLargeArray & msg, const caStatus status ); caStatus writeNotifyResponse ( casChannelI &, const caHdrLargeArray &, const caStatus status ); caStatus monitorResponse ( casChannelI & chan, const caHdrLargeArray & msg, - const smartConstGDDPointer & pDesc, const caStatus status ); + const gdd & desc, const caStatus status ); caStatus enumPostponedCreateChanResponse ( casChannelI & chan, const caHdrLargeArray & hdr, unsigned dbrType ); caStatus channelCreateFailedResp ( const caHdrLargeArray &, @@ -91,12 +91,12 @@ private: // // accessRightsResponse() // - caStatus accessRightsResponse (casChannelI *pciu); + caStatus accessRightsResponse ( casChannelI * pciu ); // // these prepare the gdd based on what is in the ca hdr // - caStatus read ( smartGDDPointer & pDesc ); + caStatus read ( const gdd * & pDesc ); caStatus write (); caStatus writeArrayData(); @@ -128,7 +128,7 @@ private: const caStatus status ); caStatus casMonitorCallBack ( casMonitor &, - const smartConstGDDPointer & pValue ); + const gdd & ); casStrmClient ( const casStrmClient & ); casStrmClient & operator = ( const casStrmClient & ); diff --git a/src/cas/generic/casdef.h b/src/cas/generic/casdef.h index 47146375e..b18c5d237 100644 --- a/src/cas/generic/casdef.h +++ b/src/cas/generic/casdef.h @@ -29,7 +29,6 @@ // #include "errMdef.h" // EPICS error codes #include "gdd.h" // EPICS data descriptors -#include "smartGDDPointer.h" // auto ref gdd pointer #include "alarm.h" // EPICS alarm severity/condition #ifdef epicsExportSharedSymbols_casdefh diff --git a/src/cas/generic/outBuf.cc b/src/cas/generic/outBuf.cc index f9f973531..a8d6ddbba 100644 --- a/src/cas/generic/outBuf.cc +++ b/src/cas/generic/outBuf.cc @@ -52,7 +52,10 @@ caStatus outBuf::allocRawMsg ( bufSizeT msgsize, void **ppMsg ) msgsize = CA_MESSAGE_ALIGN ( msgsize ); if ( msgsize > this->bufSize ) { - return S_cas_hugeRequest; + this->expandBuffer (); + if ( msgsize > this->bufSize ) { + return S_cas_hugeRequest; + } } stackNeeded = this->bufSize - msgsize; @@ -62,7 +65,7 @@ caStatus outBuf::allocRawMsg ( bufSizeT msgsize, void **ppMsg ) // // Try to flush the output queue // - this->flush ( this->stack-stackNeeded ); + this->flush ( this->stack - stackNeeded ); // // If this failed then the fd is nonblocking @@ -82,48 +85,47 @@ caStatus outBuf::allocRawMsg ( bufSizeT msgsize, void **ppMsg ) return S_cas_success; } +// code size is allowed to increase here somewhat in the +// interest of efficency since this is a very frequently +// called function caStatus outBuf::copyInHeader ( ca_uint16_t response, ca_uint32_t payloadSize, ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid, ca_uint32_t responseSpecific, void **ppPayload ) { ca_uint32_t alignedPayloadSize = CA_MESSAGE_ALIGN ( payloadSize ); - ca_uint32_t hdrSize; + char * pPayload; if ( alignedPayloadSize < 0xffff && nElem < 0xffff ) { - hdrSize = sizeof ( caHdr ); - } - else { - hdrSize = sizeof ( caHdr ) + 2 * sizeof (ca_uint32_t); - } - - caHdr * pHdr; - caStatus status = this->allocRawMsg ( hdrSize + alignedPayloadSize, - reinterpret_cast < void ** > ( & pHdr ) ); - if ( status != S_cas_success ) { - if ( status == S_cas_hugeRequest ) { - this->expandBuffer (); - status = this->allocRawMsg ( hdrSize + alignedPayloadSize, - reinterpret_cast < void ** > ( & pHdr ) ); - if ( status != S_cas_success ) { - return status; - } - } - else { + ca_uint32_t msgSize = sizeof ( caHdr ) + alignedPayloadSize; + caHdr * pHdr; + caStatus status = this->allocRawMsg ( + msgSize, reinterpret_cast < void ** > ( & pHdr ) ); + if ( status != S_cas_success ) { return status; } - } - pHdr->m_cmmd = epicsHTON16 ( response ); - pHdr->m_dataType = epicsHTON16 ( dataType ); - pHdr->m_cid = epicsHTON32 ( cid ); - pHdr->m_available = epicsHTON32 ( responseSpecific ); - char * pPayload; - if ( hdrSize == sizeof ( caHdr ) ) { + pHdr->m_cmmd = epicsHTON16 ( response ); + pHdr->m_dataType = epicsHTON16 ( dataType ); + pHdr->m_cid = epicsHTON32 ( cid ); + pHdr->m_available = epicsHTON32 ( responseSpecific ); pHdr->m_postsize = epicsHTON16 ( static_cast < epicsUInt16 > ( alignedPayloadSize ) ); pHdr->m_count = epicsHTON16 ( static_cast < epicsUInt16 > ( nElem ) ); pPayload = reinterpret_cast < char * > ( pHdr + 1 ); } else { + ca_uint32_t msgSize = sizeof ( caHdr ) + + 2 * sizeof (ca_uint32_t) + alignedPayloadSize; + caHdr * pHdr; + caStatus status = this->allocRawMsg ( + msgSize, reinterpret_cast < void ** > ( & pHdr ) ); + if ( status != S_cas_success ) { + return status; + } + + pHdr->m_cmmd = epicsHTON16 ( response ); + pHdr->m_dataType = epicsHTON16 ( dataType ); + pHdr->m_cid = epicsHTON32 ( cid ); + pHdr->m_available = epicsHTON32 ( responseSpecific ); pHdr->m_postsize = epicsHTON16 ( 0xffff ); pHdr->m_count = epicsHTON16 ( 0 ); ca_uint32_t * pLW = reinterpret_cast < ca_uint32_t * > ( pHdr + 1 ); @@ -142,7 +144,7 @@ caStatus outBuf::copyInHeader ( ca_uint16_t response, ca_uint32_t payloadSize, *ppPayload = pPayload; } - return status; + return S_cas_success; } //