diff --git a/pvDataApp/misc/byteBuffer.h b/pvDataApp/misc/byteBuffer.h index 97c132f..7c05e40 100644 --- a/pvDataApp/misc/byteBuffer.h +++ b/pvDataApp/misc/byteBuffer.h @@ -534,7 +534,8 @@ public: // NOTE: size must be power of 2 inline void align(int size) { - _position = (char*)((((uintptr_t)(const void *)_position) + size - 1) & ~((uintptr_t)(size - 1))); + const uintptr_t k = size - 1; + _position = (char*)((((uintptr_t)(const void *)_position) + k) & ~(k)); } diff --git a/pvDataApp/misc/serialize.h b/pvDataApp/misc/serialize.h index 37ef3e4..a0d5fc9 100644 --- a/pvDataApp/misc/serialize.h +++ b/pvDataApp/misc/serialize.h @@ -21,12 +21,14 @@ namespace epics { namespace pvData { virtual ~SerializableControl(){} virtual void flushSerializeBuffer() =0; virtual void ensureBuffer(int size) =0; + virtual void alignBuffer(int alignment) =0; }; class DeserializableControl { public: virtual ~DeserializableControl(){} virtual void ensureData(int size) =0; + virtual void alignData(int alignment) =0; }; class Serializable { diff --git a/pvDataApp/misc/serializeHelper.cpp b/pvDataApp/misc/serializeHelper.cpp index d29e18f..0a69b3a 100644 --- a/pvDataApp/misc/serializeHelper.cpp +++ b/pvDataApp/misc/serializeHelper.cpp @@ -61,10 +61,11 @@ namespace epics { ByteBuffer* buffer, SerializableControl* flusher) { int len = value.length(); SerializeHelper::writeSize(len, buffer, flusher); + if (len<=0) return; int i = 0; while(true) { int maxToWrite = min(len-i, (int)buffer->getRemaining()); - buffer->put(value.data(), i, maxToWrite); // UTF-8 + buffer->put(value.data(), i, maxToWrite); // ASCII i += maxToWrite; if(iflushSerializeBuffer(); @@ -83,10 +84,11 @@ namespace epics { if(offset+count>(int)value.length()) count = value.length()-offset; SerializeHelper::writeSize(count, buffer, flusher); + if (count<=0) return; int i = 0; while(true) { int maxToWrite = min(count-i, (int)buffer->getRemaining()); - buffer->put(value.data(), offset+i, maxToWrite); // UTF-8 + buffer->put(value.data(), offset+i, maxToWrite); // ASCII i += maxToWrite; if(iflushSerializeBuffer(); diff --git a/testApp/misc/testSerialization.cpp b/testApp/misc/testSerialization.cpp index b329d29..d4309d2 100644 --- a/testApp/misc/testSerialization.cpp +++ b/testApp/misc/testSerialization.cpp @@ -38,45 +38,49 @@ using namespace epics::pvData; -namespace epics { - namespace pvData { - - class SerializableControlImpl : public SerializableControl, - public NoDefaultMethods { - public: - virtual void flushSerializeBuffer() { - } - - virtual void ensureBuffer(int size) { - } - - SerializableControlImpl() { - } - - virtual ~SerializableControlImpl() { - } - }; - - class DeserializableControlImpl : public DeserializableControl, - public NoDefaultMethods { - public: - virtual void ensureData(int size) { - } - - DeserializableControlImpl() { - } - - virtual ~DeserializableControlImpl() { - } - }; - - } -} - static SerializableControl* flusher; static DeserializableControl* control; static ByteBuffer* buffer; + +class SerializableControlImpl : public SerializableControl, + public NoDefaultMethods { +public: + virtual void flushSerializeBuffer() { + } + + virtual void ensureBuffer(int size) { + } + + virtual void alignBuffer(int alignment) { + buffer->align(alignment); + } + + SerializableControlImpl() { + } + + virtual ~SerializableControlImpl() { + } +}; + +class DeserializableControlImpl : public DeserializableControl, + public NoDefaultMethods { +public: + virtual void ensureData(int size) { + } + + virtual void alignData(int alignment) { + buffer->align(alignment); + } + + DeserializableControlImpl() { + } + + virtual ~DeserializableControlImpl() { + } +}; + + void serializationTest(PVField* field) { buffer->clear();