From b783427bf7e3a6f28fc6c3a5bbff0484964a23ee Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 13 Mar 2017 19:22:53 -0400 Subject: [PATCH] pcas: support larger than max array bytes clientBufMemoryManager already supports allocations larger than max array bytes, adjust callers inBuf/outBuf to actually request larger allocations. --- src/ca/legacy/pcas/generic/casStrmClient.cc | 2 +- .../pcas/generic/clientBufMemoryManager.cpp | 5 ----- .../pcas/generic/clientBufMemoryManager.h | 2 +- src/ca/legacy/pcas/generic/inBuf.cc | 18 +++++++++++++----- src/ca/legacy/pcas/generic/inBuf.h | 4 ++-- src/ca/legacy/pcas/generic/outBuf.cc | 16 +++++++++++----- src/ca/legacy/pcas/generic/outBuf.h | 2 +- 7 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/ca/legacy/pcas/generic/casStrmClient.cc b/src/ca/legacy/pcas/generic/casStrmClient.cc index ff12e889e..2da59b9d4 100644 --- a/src/ca/legacy/pcas/generic/casStrmClient.cc +++ b/src/ca/legacy/pcas/generic/casStrmClient.cc @@ -205,7 +205,7 @@ caStatus casStrmClient :: processMsg () if ( bytesLeft < msgSize ) { status = S_cas_success; if ( msgSize > this->in.bufferSize() ) { - this->in.expandBuffer (); + this->in.expandBuffer (msgSize); // msg to large - set up message drain if ( msgSize > this->in.bufferSize() ) { caServerI::dumpMsg ( this->pHostName, this->pUserName, & msgTmp, 0, diff --git a/src/ca/legacy/pcas/generic/clientBufMemoryManager.cpp b/src/ca/legacy/pcas/generic/clientBufMemoryManager.cpp index 2f5fc128b..53a638735 100644 --- a/src/ca/legacy/pcas/generic/clientBufMemoryManager.cpp +++ b/src/ca/legacy/pcas/generic/clientBufMemoryManager.cpp @@ -16,11 +16,6 @@ #define epicsExportSharedSymbols #include "clientBufMemoryManager.h" -bufSizeT clientBufMemoryManager::maxSize () const -{ - return bufferFactory.largeBufferSize (); -} - casBufferParm clientBufMemoryManager::allocate ( bufSizeT newMinSize ) { casBufferParm parm; diff --git a/src/ca/legacy/pcas/generic/clientBufMemoryManager.h b/src/ca/legacy/pcas/generic/clientBufMemoryManager.h index 9d63431e7..8a2db0da5 100644 --- a/src/ca/legacy/pcas/generic/clientBufMemoryManager.h +++ b/src/ca/legacy/pcas/generic/clientBufMemoryManager.h @@ -39,9 +39,9 @@ struct casBufferParm { class clientBufMemoryManager { public: + //! @throws std::bad_alloc on failure casBufferParm allocate ( bufSizeT newMinSize ); void release ( char * pBuf, bufSizeT bufSize ); - bufSizeT maxSize () const; private: casBufferFactory bufferFactory; }; diff --git a/src/ca/legacy/pcas/generic/inBuf.cc b/src/ca/legacy/pcas/generic/inBuf.cc index db97a082c..43250d6e4 100644 --- a/src/ca/legacy/pcas/generic/inBuf.cc +++ b/src/ca/legacy/pcas/generic/inBuf.cc @@ -13,6 +13,8 @@ * 505 665 1831 */ +#include + #include #include @@ -155,11 +157,17 @@ bufSizeT inBuf::popCtx ( const inBufCtx &ctx ) } } -void inBuf::expandBuffer () +void inBuf::expandBuffer (bufSizeT needed) { - bufSizeT max = this->memMgr.maxSize(); - if ( this->bufSize < max ) { - casBufferParm bufParm = this->memMgr.allocate ( max ); + if (needed > bufSize) { + casBufferParm bufParm; + try { + bufParm = this->memMgr.allocate ( needed ); + } catch (std::bad_alloc& e) { + // caller must check that buffer size has expended + return; + } + bufSizeT unprocessedBytes = this->bytesPresent (); memcpy ( bufParm.pBuf, &this->pBuf[this->nextReadIndex], unprocessedBytes ); this->bytesInBuffer = unprocessedBytes; @@ -170,7 +178,7 @@ void inBuf::expandBuffer () } } -unsigned inBuf::bufferSize () const +bufSizeT inBuf::bufferSize() const { return this->bufSize; } diff --git a/src/ca/legacy/pcas/generic/inBuf.h b/src/ca/legacy/pcas/generic/inBuf.h index 180fc5a6d..8098ad26e 100644 --- a/src/ca/legacy/pcas/generic/inBuf.h +++ b/src/ca/legacy/pcas/generic/inBuf.h @@ -82,8 +82,8 @@ public: // const inBufCtx pushCtx ( bufSizeT headerSize, bufSizeT bodySize ); bufSizeT popCtx ( const inBufCtx & ); // returns actual size - unsigned bufferSize () const; - void expandBuffer (); + bufSizeT bufferSize () const; + void expandBuffer (bufSizeT needed); private: class inBufClient & client; class clientBufMemoryManager & memMgr; diff --git a/src/ca/legacy/pcas/generic/outBuf.cc b/src/ca/legacy/pcas/generic/outBuf.cc index e755753e8..ed9cd8505 100644 --- a/src/ca/legacy/pcas/generic/outBuf.cc +++ b/src/ca/legacy/pcas/generic/outBuf.cc @@ -59,7 +59,7 @@ caStatus outBuf::allocRawMsg ( bufSizeT msgsize, void **ppMsg ) msgsize = CA_MESSAGE_ALIGN ( msgsize ); if ( msgsize > this->bufSize ) { - this->expandBuffer (); + this->expandBuffer (msgsize); if ( msgsize > this->bufSize ) { return S_cas_hugeRequest; } @@ -316,11 +316,17 @@ void outBuf::show (unsigned level) const } } -void outBuf::expandBuffer () +void outBuf::expandBuffer (bufSizeT needed) { - bufSizeT max = this->memMgr.maxSize(); - if ( this->bufSize < max ) { - casBufferParm bufParm = this->memMgr.allocate ( max ); + if (needed > bufSize) { + casBufferParm bufParm; + try { + bufParm = this->memMgr.allocate ( needed ); + } catch (std::bad_alloc& e) { + // caller must check that buffer size has expended + return; + } + memcpy ( bufParm.pBuf, this->pBuf, this->stack ); this->memMgr.release ( this->pBuf, this->bufSize ); this->pBuf = bufParm.pBuf; diff --git a/src/ca/legacy/pcas/generic/outBuf.h b/src/ca/legacy/pcas/generic/outBuf.h index 849964bf2..87a428bbe 100644 --- a/src/ca/legacy/pcas/generic/outBuf.h +++ b/src/ca/legacy/pcas/generic/outBuf.h @@ -122,7 +122,7 @@ private: bufSizeT stack; unsigned ctxRecursCount; - void expandBuffer (); + void expandBuffer (bufSizeT needed); outBuf ( const outBuf & ); outBuf & operator = ( const outBuf & );