diff --git a/pvDataApp/factory/PVDataCreateFactory.cpp b/pvDataApp/factory/PVDataCreateFactory.cpp index f18dfbe..baf1047 100644 --- a/pvDataApp/factory/PVDataCreateFactory.cpp +++ b/pvDataApp/factory/PVDataCreateFactory.cpp @@ -337,8 +337,20 @@ void DefaultPVArray::deserialize(ByteBuffer *pbuffer, if(size>this->getCapacity()) this->setCapacity(size); // set new length this->setLength(size); + + // try to avoid deserializing from the buffer + // this is only possible if we do not need to do endian-swapping + if (!pbuffer->reverse()) + if (pcontrol->directDeserialize(pbuffer, (char*)(get()), size, sizeof(T))) + { + // inform about the change? + PVField::postPut(); + return; + } + // retrieve value from the buffer size_t i = 0; + T * pvalue = get(); while(true) { /* size_t maxIndex = min(size-i, (int)(pbuffer->getRemaining()/sizeof(T)))+i; @@ -346,7 +358,7 @@ void DefaultPVArray::deserialize(ByteBuffer *pbuffer, value[i] = pbuffer->get(); */ size_t maxCount = min(size-i, (pbuffer->getRemaining()/sizeof(T))); - pbuffer->getArray(get()+i, maxCount); + pbuffer->getArray(pvalue+i, maxCount); i += maxCount; if(i::serialize(ByteBuffer *pbuffer, // write SerializeHelper::writeSize(count, pbuffer, pflusher); //if (count == 0) return; pcontrol->ensureData(sizeof(T)-1); pbuffer->align(sizeof(T)); + + + // try to avoid copying into the buffer + // this is only possible if we do not need to do endian-swapping + if (!pbuffer->reverse()) + if (pflusher->directSerialize(pbuffer, (const char*)(get()+offset), count, sizeof(T))) + return; + size_t end = offset+count; size_t i = offset; + T * pvalue = const_cast(get()); while(true) { /* @@ -389,7 +410,6 @@ void DefaultPVArray::serialize(ByteBuffer *pbuffer, */ size_t maxCount = min(end-i, (int)(pbuffer->getRemaining()/sizeof(T))); - T * pvalue = const_cast(get()); pbuffer->putArray(pvalue+i, maxCount); i += maxCount; diff --git a/pvDataApp/misc/byteBuffer.h b/pvDataApp/misc/byteBuffer.h index cfeebfc..5964668 100644 --- a/pvDataApp/misc/byteBuffer.h +++ b/pvDataApp/misc/byteBuffer.h @@ -608,6 +608,24 @@ private: bool _reverseFloatEndianess; }; + template<> + inline bool ByteBuffer::reverse() + { + return false; + } + + template<> + inline bool ByteBuffer::reverse() + { + return false; + } + + template<> + inline bool ByteBuffer::reverse() + { + return false; + } + template<> inline bool ByteBuffer::reverse() { diff --git a/pvDataApp/misc/serialize.h b/pvDataApp/misc/serialize.h index ae6c74b..6e19fe7 100644 --- a/pvDataApp/misc/serialize.h +++ b/pvDataApp/misc/serialize.h @@ -27,6 +27,8 @@ namespace epics { namespace pvData { virtual void flushSerializeBuffer() =0; virtual void ensureBuffer(std::size_t size) =0; virtual void alignBuffer(std::size_t alignment) =0; + virtual bool directSerialize(ByteBuffer *existingBuffer, const char* toSerialize, + std::size_t elementCount, std::size_t elementSize) = 0; virtual void cachedSerialize(std::tr1::shared_ptr const & field, ByteBuffer* buffer) = 0; }; @@ -35,6 +37,8 @@ namespace epics { namespace pvData { virtual ~DeserializableControl(){} virtual void ensureData(std::size_t size) =0; virtual void alignData(std::size_t alignment) =0; + virtual bool directDeserialize(ByteBuffer *existingBuffer, char* deserializeTo, + std::size_t elementCount, std::size_t elementSize) = 0; virtual std::tr1::shared_ptr cachedDeserialize(ByteBuffer* buffer) = 0; }; diff --git a/pvDataCPP.config b/pvDataCPP.config new file mode 100644 index 0000000..8cec188 --- /dev/null +++ b/pvDataCPP.config @@ -0,0 +1 @@ +// ADD PREDEFINED MACROS HERE! diff --git a/pvDataCPP.creator b/pvDataCPP.creator new file mode 100644 index 0000000..e94cbbd --- /dev/null +++ b/pvDataCPP.creator @@ -0,0 +1 @@ +[General] diff --git a/pvDataCPP.files b/pvDataCPP.files new file mode 100644 index 0000000..0985d44 --- /dev/null +++ b/pvDataCPP.files @@ -0,0 +1,211 @@ +configure/CONFIG +configure/CONFIG_SITE +configure/RELEASE +configure/RELEASE.local +configure/RULES +configure/RULES.ioc +configure/RULES_DIRS +configure/RULES_TOP +documentation/pvDataCPP.html +documentation/pvDataCPP_20120927.html +documentation/pvDataCPP_20121001.html +documentation/pvDataCPP_20121026.html +documentation/pvDataCPP_20121212.html +jenkins/cloudbees_build +pvDataApp/factory/Compare.cpp +pvDataApp/factory/Convert.cpp +pvDataApp/factory/factory.h +pvDataApp/factory/FieldCreateFactory.cpp +pvDataApp/factory/PVArray.cpp +pvDataApp/factory/PVAuxInfoImpl.cpp +pvDataApp/factory/PVDataCreateFactory.cpp +pvDataApp/factory/PVDataCreateFactory.cpp.orig +pvDataApp/factory/PVField.cpp +pvDataApp/factory/PVScalar.cpp +pvDataApp/factory/PVScalarArray.cpp +pvDataApp/factory/PVStructure.cpp +pvDataApp/factory/PVStructureArray.cpp +pvDataApp/factory/StandardField.cpp +pvDataApp/factory/StandardPVField.cpp +pvDataApp/factory/TypeFunc.cpp +pvDataApp/misc/bitSet.cpp +pvDataApp/misc/bitSet.h +pvDataApp/misc/byteBuffer.cpp +pvDataApp/misc/byteBuffer.h +pvDataApp/misc/destroyable.h +pvDataApp/misc/epicsException.cpp +pvDataApp/misc/epicsException.h +pvDataApp/misc/event.cpp +pvDataApp/misc/event.h +pvDataApp/misc/executor.cpp +pvDataApp/misc/executor.h +pvDataApp/misc/localStaticLock.cpp +pvDataApp/misc/localStaticLock.h +pvDataApp/misc/localStaticLock.h.orig +pvDataApp/misc/lock.h +pvDataApp/misc/messageQueue.cpp +pvDataApp/misc/messageQueue.h +pvDataApp/misc/noDefaultMethods.h +pvDataApp/misc/queue.h +pvDataApp/misc/requester.cpp +pvDataApp/misc/requester.h +pvDataApp/misc/requester.h.orig +pvDataApp/misc/serialize.h +pvDataApp/misc/serializeHelper.cpp +pvDataApp/misc/serializeHelper.h +pvDataApp/misc/sharedPtr.h +pvDataApp/misc/status.cpp +pvDataApp/misc/status.h +pvDataApp/misc/thread.h +pvDataApp/misc/timeFunction.cpp +pvDataApp/misc/timeFunction.h +pvDataApp/misc/timer.cpp +pvDataApp/misc/timer.h +pvDataApp/monitor/monitor.h +pvDataApp/O.linux-x86_64/alarm.d +pvDataApp/O.linux-x86_64/bitSet.d +pvDataApp/O.linux-x86_64/bitSetUtil.d +pvDataApp/O.linux-x86_64/byteBuffer.d +pvDataApp/O.linux-x86_64/Compare.d +pvDataApp/O.linux-x86_64/Convert.d +pvDataApp/O.linux-x86_64/epicsException.d +pvDataApp/O.linux-x86_64/event.d +pvDataApp/O.linux-x86_64/executor.d +pvDataApp/O.linux-x86_64/FieldCreateFactory.d +pvDataApp/O.linux-x86_64/libpvData.a +pvDataApp/O.linux-x86_64/libpvData.so +pvDataApp/O.linux-x86_64/localStaticLock.d +pvDataApp/O.linux-x86_64/messageQueue.d +pvDataApp/O.linux-x86_64/pvAlarm.d +pvDataApp/O.linux-x86_64/PVArray.d +pvDataApp/O.linux-x86_64/PVAuxInfoImpl.d +pvDataApp/O.linux-x86_64/pvControl.d +pvDataApp/O.linux-x86_64/PVDataCreateFactory.d +pvDataApp/O.linux-x86_64/pvDisplay.d +pvDataApp/O.linux-x86_64/pvEnumerated.d +pvDataApp/O.linux-x86_64/PVField.d +pvDataApp/O.linux-x86_64/PVScalar.d +pvDataApp/O.linux-x86_64/PVScalarArray.d +pvDataApp/O.linux-x86_64/PVStructure.d +pvDataApp/O.linux-x86_64/PVStructureArray.d +pvDataApp/O.linux-x86_64/pvTimeStamp.d +pvDataApp/O.linux-x86_64/requester.d +pvDataApp/O.linux-x86_64/serializeHelper.d +pvDataApp/O.linux-x86_64/StandardField.d +pvDataApp/O.linux-x86_64/StandardPVField.d +pvDataApp/O.linux-x86_64/status.d +pvDataApp/O.linux-x86_64/timeFunction.d +pvDataApp/O.linux-x86_64/timer.d +pvDataApp/O.linux-x86_64/timeStamp.d +pvDataApp/O.linux-x86_64/TypeFunc.d +pvDataApp/property/alarm.cpp +pvDataApp/property/alarm.h +pvDataApp/property/alarm.h.orig +pvDataApp/property/control.h +pvDataApp/property/display.h +pvDataApp/property/pvAlarm.cpp +pvDataApp/property/pvAlarm.h +pvDataApp/property/pvControl.cpp +pvDataApp/property/pvControl.h +pvDataApp/property/pvDisplay.cpp +pvDataApp/property/pvDisplay.h +pvDataApp/property/pvEnumerated.cpp +pvDataApp/property/pvEnumerated.h +pvDataApp/property/pvTimeStamp.cpp +pvDataApp/property/pvTimeStamp.h +pvDataApp/property/timeStamp.cpp +pvDataApp/property/timeStamp.h +pvDataApp/property/timeStamp.h.orig +pvDataApp/pv/convert.h +pvDataApp/pv/convert.h.orig +pvDataApp/pv/pvData.h +pvDataApp/pv/pvData.h.orig +pvDataApp/pv/pvIntrospect.h +pvDataApp/pv/pvIntrospect.h.orig +pvDataApp/pv/pvType.h +pvDataApp/pv/standardField.h +pvDataApp/pv/standardField.h.orig +pvDataApp/pv/standardPVField.h +pvDataApp/pv/standardPVField.h.orig +pvDataApp/pvMisc/bitSetUtil.cpp +pvDataApp/pvMisc/bitSetUtil.h +testApp/capi/O.linux-x86_64/libtestc.a +testApp/capi/O.linux-x86_64/libtestc.so +testApp/capi/O.linux-x86_64/testc.d +testApp/capi/testc.cpp +testApp/capi/testc.py +testApp/mb/O.linux-x86_64/mb_test +testApp/mb/O.linux-x86_64/mb_test.d +testApp/misc/O.linux-x86_64/testBaseException +testApp/misc/O.linux-x86_64/testBaseException.d +testApp/misc/O.linux-x86_64/testBitSet +testApp/misc/O.linux-x86_64/testBitSet.d +testApp/misc/O.linux-x86_64/testByteBuffer +testApp/misc/O.linux-x86_64/testByteBuffer.d +testApp/misc/O.linux-x86_64/testByteOrder +testApp/misc/O.linux-x86_64/testByteOrder.d +testApp/misc/O.linux-x86_64/testMessageQueue +testApp/misc/O.linux-x86_64/testMessageQueue.d +testApp/misc/O.linux-x86_64/testQueue +testApp/misc/O.linux-x86_64/testQueue.d +testApp/misc/O.linux-x86_64/testSerialization +testApp/misc/O.linux-x86_64/testSerialization.d +testApp/misc/O.linux-x86_64/testThread +testApp/misc/O.linux-x86_64/testThread.d +testApp/misc/O.linux-x86_64/testTimer +testApp/misc/O.linux-x86_64/testTimer.d +testApp/misc/O.linux-x86_64/testTimeStamp +testApp/misc/O.linux-x86_64/testTimeStamp.d +testApp/misc/testBaseException.cpp +testApp/misc/testBitSet.cpp +testApp/misc/testByteBuffer.cpp +testApp/misc/testByteOrder.cpp +testApp/misc/testMessageQueue.cpp +testApp/misc/testQueue.cpp +testApp/misc/testSerialization.cpp +testApp/misc/testThread.cpp +testApp/misc/testTimer.cpp +testApp/misc/testTimeStamp.cpp +testApp/monitor/O.linux-x86_64/testMonitor +testApp/monitor/O.linux-x86_64/testMonitor.d +testApp/monitor/testMonitor.cpp +testApp/property/O.linux-x86_64/testProperty +testApp/property/O.linux-x86_64/testProperty.d +testApp/property/testProperty.cpp +testApp/pv/O.linux-x86_64/testConvert +testApp/pv/O.linux-x86_64/testConvert.d +testApp/pv/O.linux-x86_64/testIntrospect +testApp/pv/O.linux-x86_64/testIntrospect.d +testApp/pv/O.linux-x86_64/testOperators +testApp/pv/O.linux-x86_64/testOperators.d +testApp/pv/O.linux-x86_64/testPVAppend +testApp/pv/O.linux-x86_64/testPVAppend.d +testApp/pv/O.linux-x86_64/testPVAuxInfo +testApp/pv/O.linux-x86_64/testPVAuxInfo.d +testApp/pv/O.linux-x86_64/testPVData +testApp/pv/O.linux-x86_64/testPVData.d +testApp/pv/O.linux-x86_64/testPVScalarArray +testApp/pv/O.linux-x86_64/testPVScalarArray.d +testApp/pv/O.linux-x86_64/testPVStructureArray +testApp/pv/O.linux-x86_64/testPVStructureArray.d +testApp/pv/O.linux-x86_64/testPVType +testApp/pv/O.linux-x86_64/testPVType.d +testApp/pv/O.linux-x86_64/testStandardField +testApp/pv/O.linux-x86_64/testStandardField.d +testApp/pv/O.linux-x86_64/testStandardPVField +testApp/pv/O.linux-x86_64/testStandardPVField.d +testApp/pv/testConvert.cpp +testApp/pv/testIntrospect.cpp +testApp/pv/testOperators.cpp +testApp/pv/testPVAppend.cpp +testApp/pv/testPVAuxInfo.cpp +testApp/pv/testPVData.cpp +testApp/pv/testPVScalarArray.cpp +testApp/pv/testPVStructureArray.cpp +testApp/pv/testPVType.cpp +testApp/pv/testStandardField.cpp +testApp/pv/testStandardPVField.cpp +COPYRIGHT +Doxyfile +LICENSE +README.html \ No newline at end of file diff --git a/pvDataCPP.includes b/pvDataCPP.includes new file mode 100644 index 0000000..56eba21 --- /dev/null +++ b/pvDataCPP.includes @@ -0,0 +1,6 @@ +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/factory +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/misc +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/monitor +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/property +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/pv +/home/msekoranja/epicsV4/pvDataCPP/pvDataApp/pvMisc \ No newline at end of file diff --git a/testApp/misc/testSerialization.cpp b/testApp/misc/testSerialization.cpp index 238bd7f..a1fd98f 100644 --- a/testApp/misc/testSerialization.cpp +++ b/testApp/misc/testSerialization.cpp @@ -63,6 +63,12 @@ public: buffer->align(alignment); } + virtual bool directSerialize(ByteBuffer */*existingBuffer*/, const char* /*toSerialize*/, + std::size_t /*elementCount*/, std::size_t /*elementSize*/) + { + return false; + } + virtual void cachedSerialize(std::tr1::shared_ptr const & field, ByteBuffer* buffer) { field->serialize(buffer, this); @@ -85,6 +91,12 @@ public: buffer->align(alignment); } + virtual bool directDeserialize(ByteBuffer */*existingBuffer*/, char* /*deserializeTo*/, + std::size_t /*elementCount*/, std::size_t /*elementSize*/) + { + return false; + } + virtual std::tr1::shared_ptr cachedDeserialize(ByteBuffer* buffer) { return getFieldCreate()->deserialize(buffer, this);