diff --git a/pvDataApp/factory/BasePVStructure.h b/pvDataApp/factory/BasePVStructure.h index 5256e83..fa814c9 100644 --- a/pvDataApp/factory/BasePVStructure.h +++ b/pvDataApp/factory/BasePVStructure.h @@ -12,6 +12,7 @@ #include #include "pvData.h" #include "factory.h" +#include "bitSet.h" namespace epics { namespace pvData { diff --git a/pvDataApp/misc/bitSet.cpp b/pvDataApp/misc/bitSet.cpp index fe0b620..4b4f3b9 100644 --- a/pvDataApp/misc/bitSet.cpp +++ b/pvDataApp/misc/bitSet.cpp @@ -9,6 +9,7 @@ #include "bitSet.h" #include "lock.h" #include "showConstructDestruct.h" +#include "serializeHelper.h" namespace epics { namespace pvData { @@ -374,55 +375,55 @@ namespace epics { namespace pvData { *buffer += '}'; } - - /* - -void serialize(ByteBuffer buffer, SerializableControl flusher) { - - final int n = wordsInUse; - if (n == 0) { - SerializeHelper.writeSize(0, buffer, flusher); - return; + void BitSet::serialize(ByteBuffer* buffer, SerializableControl* flusher) { + + uint32 n = wordsInUse; + if (n == 0) { + SerializeHelper::writeSize(0, buffer, flusher); + return; + } + uint32 len = 8 * (n-1); + for (uint64 x = words[n - 1]; x != 0; x >>= 8) + len++; + + SerializeHelper::writeSize(len, buffer, flusher); + flusher->ensureBuffer(len); + + for (uint32 i = 0; i < n - 1; i++) + buffer->putLong(words[i]); + + for (uint64 x = words[n - 1]; x != 0; x >>= 8) + buffer->putByte((int8) (x & 0xff)); + } + + void BitSet::deserialize(ByteBuffer* buffer, DeserializableControl* control) { + + uint32 bytes = SerializeHelper::readSize(buffer, control); // in bytes + + wordsInUse = (bytes + 7) / 8; + if (wordsInUse > wordsLength) + { + if (words) delete[] words; + words = new uint64[wordsInUse]; + wordsLength = wordsInUse; + } + + if (wordsInUse == 0) + return; + + control->ensureData(bytes); + + uint32 i = 0; + uint32 longs = bytes / 8; + while (i < longs) + words[i++] = buffer->getLong(); + + for (uint32 j = i; j < wordsInUse; j++) + words[j] = 0; + + for (uint32 remaining = (bytes - longs * 8), j = 0; j < remaining; j++) + words[i] |= (buffer->getByte() & 0xffL) << (8 * j); + } - int len = 8 * (n-1); - for (long x = words[n - 1]; x != 0; x >>>= 8) - len++; - - SerializeHelper.writeSize(len, buffer, flusher); - flusher.ensureBuffer(len); - - for (int i = 0; i < n - 1; i++) - buffer.putLong(words[i]); - - for (long x = words[n - 1]; x != 0; x >>>= 8) - buffer.put((byte) (x & 0xff)); -} - -public void deserialize(ByteBuffer buffer, DeserializableControl control) { - - final int bytes = SerializeHelper.readSize(buffer, control); // in bytes - - wordsInUse = (bytes + 7) / 8; - if (wordsInUse > words.length) - words = new long[wordsInUse]; - - if (wordsInUse == 0) - return; - - control.ensureData(bytes); - - int i = 0; - final int longs = bytes / 8; - while (i < longs) - words[i++] = buffer.getLong(); - - for (int j = i; j < wordsInUse; j++) - words[j] = 0; - - for (int remaining = (bytes - longs * 8), j = 0; j < remaining; j++) - words[i] |= (buffer.get() & 0xffL) << (8 * j); - -} - */ }}; diff --git a/pvDataApp/misc/bitSet.h b/pvDataApp/misc/bitSet.h index 8d5bebb..525e111 100644 --- a/pvDataApp/misc/bitSet.h +++ b/pvDataApp/misc/bitSet.h @@ -9,8 +9,8 @@ #include #include #include "factory.h" -//#include "byteBuffer.h" -//#include "serialize.h" +#include "serialize.h" + namespace epics { namespace pvData { /** @@ -36,7 +36,7 @@ namespace epics { namespace pvData { * * Based on Java implementation. */ - class BitSet /*: public Serializable*/ { + class BitSet : public Serializable { public: /** @@ -216,6 +216,11 @@ namespace epics { namespace pvData { void toString(StringBuilder buffer, int indentLevel = 0) const; + virtual void serialize(ByteBuffer *buffer, + SerializableControl *flusher); + virtual void deserialize(ByteBuffer *buffer, + DeserializableControl *flusher); + private: /* diff --git a/pvDataApp/misc/serialize.h b/pvDataApp/misc/serialize.h index 45e65f8..effc763 100644 --- a/pvDataApp/misc/serialize.h +++ b/pvDataApp/misc/serialize.h @@ -6,7 +6,6 @@ */ #ifndef SERIALIZE_H #define SERIALIZE_H -#include "bitSet.h" #include "byteBuffer.h" namespace epics { namespace pvData { @@ -15,6 +14,7 @@ namespace epics { namespace pvData { class Serializable; class BitSetSerializable; class SerializableArray; + class BitSet; class SerializableControl { public: diff --git a/pvDataApp/misc/showConstructDestruct.h b/pvDataApp/misc/showConstructDestruct.h index b8e1973..643b9ac 100644 --- a/pvDataApp/misc/showConstructDestruct.h +++ b/pvDataApp/misc/showConstructDestruct.h @@ -69,39 +69,39 @@ extern ShowConstructDestruct* getShowConstructDestruct(); #define PVDATA_REFCOUNT_MONITOR_DEFINE(NAME) \ static volatile int64 NAME ## _totalConstruct = 0; \ static volatile int64 NAME ## _totalDestruct = 0; \ - static Mutex globalMutex; \ + static Mutex NAME ## _globalMutex; \ \ - static bool notInited = true; \ + static bool NAME ## _notInited = true; \ static int64 NAME ## _processTotalConstruct() \ { \ - Lock xx(&globalMutex); \ + Lock xx(&NAME ## _globalMutex); \ return NAME ## _totalConstruct; \ } \ \ static int64 NAME ## _processTotalDestruct() \ { \ - Lock xx(&globalMutex); \ + Lock xx(&NAME ## _globalMutex); \ return NAME ## _totalDestruct; \ } \ \ static void NAME ## _init() \ { \ - Lock xx(&globalMutex); \ - if(notInited) { \ - notInited = false; \ + Lock xx(&NAME ## _globalMutex); \ + if(NAME ## _notInited) { \ + NAME ## _notInited = false; \ ShowConstructDestruct::registerCallback( \ - String("#NAME"), \ - NAME ## _processTotalConstruct,NAME ## _processTotalDestruct,0); \ + String(#NAME), \ + NAME ## _processTotalConstruct,NAME ## _processTotalDestruct,0,0); \ } \ } #define PVDATA_REFCOUNT_MONITOR_DESTRUCT(NAME) \ - Lock xx(&globalMutex); \ + Lock xx(&NAME ## _globalMutex); \ NAME ## _totalDestruct++; #define PVDATA_REFCOUNT_MONITOR_CONSTRUCT(NAME) \ NAME ## _init(); \ - Lock xx(&globalMutex); \ + Lock xx(&NAME ## _globalMutex); \ NAME ## _totalConstruct++; diff --git a/pvDataApp/pvMisc/bitSetUtil.h b/pvDataApp/pvMisc/bitSetUtil.h index 1c7c7f4..f6f52ce 100644 --- a/pvDataApp/pvMisc/bitSetUtil.h +++ b/pvDataApp/pvMisc/bitSetUtil.h @@ -8,6 +8,7 @@ #define BITSETUTIL_H #include "noDefaultMethods.h" #include "pvData.h" +#include "bitSet.h" namespace epics { namespace pvData { diff --git a/test/testLinkedListAux b/test/testLinkedListAux index a295822..2f2c36a 100644 --- a/test/testLinkedListAux +++ b/test/testLinkedListAux @@ -1,20 +1,20 @@ Time test -diff 23.288030 milliSeconds -time per iteration 23.288030 microseconds -time per addTail/removeHead 0.011644 microseconds +diff 23.955010 milliSeconds +time per iteration 23.955010 microseconds +time per addTail/removeHead 0.011978 microseconds Time test locked -diff 175.968013 milliSeconds -time per iteration 175.968013 microseconds -time per addTail/removeHead 0.087984 microseconds +diff 176.706476 milliSeconds +time per iteration 176.706476 microseconds +time per addTail/removeHead 0.088353 microseconds Time std::list test -diff 631.892603 milliSeconds -time per iteration 631.892603 microseconds -time per addTail/removeHead 0.315946 microseconds +diff 631.501215 milliSeconds +time per iteration 631.501215 microseconds +time per addTail/removeHead 0.315751 microseconds Time std::list test locked -diff 791.255075 milliSeconds -time per iteration 791.255075 microseconds -time per addTail/removeHead 0.395628 microseconds +diff 787.995967 milliSeconds +time per iteration 787.995967 microseconds +time per addTail/removeHead 0.393998 microseconds diff --git a/test/testThreadAux b/test/testThreadAux index 94bd57b..521fefa 100644 --- a/test/testThreadAux +++ b/test/testThreadAux @@ -1 +1 @@ -time per call 40.057018 microseconds +time per call 40.790343 microseconds diff --git a/test/testTimeStampAux b/test/testTimeStampAux index 9693dc4..01e82ad 100644 --- a/test/testTimeStampAux +++ b/test/testTimeStampAux @@ -1,5 +1,5 @@ -current 1295462802 840097682 milliSec 1295462802840 -2011.01.19 13:46:42 840097682 nanoSeconds isDst false +current 1295465466 621311375 milliSec 1295465466621 +2011.01.19 14:31:06 621311375 nanoSeconds isDst false fromTime_t -current 1295462802 0 milliSec 1295462802000 -2011.01.19 13:46:42 0 nanoSeconds isDst false +current 1295465466 0 milliSec 1295465466000 +2011.01.19 14:31:06 0 nanoSeconds isDst false diff --git a/test/testTimerAux b/test/testTimerAux index d69a912..3873bb0 100644 --- a/test/testTimerAux +++ b/test/testTimerAux @@ -1,6 +1,6 @@ -one requested 0.400000 diff 0.400263 seconds -two requested 0.200000 diff 0.200168 seconds -one requested 0.200000 diff 0.200136 seconds -two requested 0.400000 diff 0.400176 seconds -one requested 0.000000 diff 0.000011 seconds -two requested 0.000000 diff 0.000018 seconds +one requested 0.400000 diff 0.400195 seconds +two requested 0.200000 diff 0.200170 seconds +one requested 0.200000 diff 0.200124 seconds +two requested 0.400000 diff 0.400223 seconds +one requested 0.000000 diff 0.000039 seconds +two requested 0.000000 diff 0.000060 seconds