From b9b03940a2accdaf6d3f1850b7a900a808ba9f43 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 8 Apr 2014 13:27:24 +0200 Subject: [PATCH 1/2] DefaultArray deserialize fix --- pvDataApp/factory/PVDataCreateFactory.cpp | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/pvDataApp/factory/PVDataCreateFactory.cpp b/pvDataApp/factory/PVDataCreateFactory.cpp index f8c6a89..497edc0 100644 --- a/pvDataApp/factory/PVDataCreateFactory.cpp +++ b/pvDataApp/factory/PVDataCreateFactory.cpp @@ -308,15 +308,8 @@ void DefaultPVArray::deserialize(ByteBuffer *pbuffer, const size_t available = have_bytes/sizeof(T); if(available == 0) { - size_t want = sizeof(T); - if(remaining==1 && sizeof(T)>1) { - // Need to wait for the last few bytes - // of the final element. - // available==0 implies have_bytesensureData(want); + // get at least one element + pcontrol->ensureData(sizeof(T)); continue; } From 76a54d38e4bd65cdc06e0d9acf1afec02e069f09 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 9 Apr 2014 15:18:40 +0200 Subject: [PATCH 2/2] byteBuffer: wrapped buffer support --- pvDataApp/misc/byteBuffer.h | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/pvDataApp/misc/byteBuffer.h b/pvDataApp/misc/byteBuffer.h index 2be3eb8..13bdec4 100644 --- a/pvDataApp/misc/byteBuffer.h +++ b/pvDataApp/misc/byteBuffer.h @@ -202,22 +202,40 @@ public: * * @param size The number of bytes. * @param byteOrder The byte order. - * Must be one of EPICS_BYTE_ORDER,EPICS_ENDIAN_LITTLE,EPICS_ENDIAN_BIG, + * Must be one of EPICS_BYTE_ORDER,EPICS_ENDIAN_LITTLE,EPICS_ENDIAN_BIG. */ ByteBuffer(std::size_t size, int byteOrder = EPICS_BYTE_ORDER) : _buffer(0), _size(size), _reverseEndianess(byteOrder != EPICS_BYTE_ORDER), - _reverseFloatEndianess(byteOrder != EPICS_FLOAT_WORD_ORDER) + _reverseFloatEndianess(byteOrder != EPICS_FLOAT_WORD_ORDER), + _wrapped(false) { _buffer = (char*)malloc(size); clear(); } + + /** + * Constructor for wrapping existing buffers. + * Given buffer will not be released by the ByteBuffer instance. + * @param buffer Existing buffer. + * @param size The number of bytes. + * @param byteOrder The byte order. + * Must be one of EPICS_BYTE_ORDER,EPICS_ENDIAN_LITTLE,EPICS_ENDIAN_BIG. + */ + ByteBuffer(char* buffer, std::size_t size, int byteOrder = EPICS_BYTE_ORDER) : + _buffer(buffer), _size(size), + _reverseEndianess(byteOrder != EPICS_BYTE_ORDER), + _reverseFloatEndianess(byteOrder != EPICS_FLOAT_WORD_ORDER), + _wrapped(true) + { + clear(); + } /** * Destructor */ ~ByteBuffer() { - if (_buffer) free(_buffer); + if (_buffer && !_wrapped) free(_buffer); } /** * Set the byte order. @@ -618,7 +636,8 @@ private: char* _limit; std::size_t _size; bool _reverseEndianess; - bool _reverseFloatEndianess; + bool _reverseFloatEndianess; + bool _wrapped; }; template<>