From 4b5bc3883590b0bd48fb0313f0b23675a2df4522 Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Fri, 15 Jun 2012 14:47:16 +0200 Subject: [PATCH] unsigned/size_t/shared ptrs --- .cproject | 174 +++++++++------- README | 19 +- pvAccessApp/factory/CreateRequestFactory.cpp | 73 +++---- .../remote/abstractResponseHandler.cpp | 2 +- .../remote/blockingClientTCPTransport.cpp | 2 +- .../remote/blockingServerTCPTransport.cpp | 3 +- pvAccessApp/remote/blockingTCP.h | 38 ++-- pvAccessApp/remote/blockingTCPTransport.cpp | 46 +++-- pvAccessApp/remote/blockingUDP.h | 10 +- pvAccessApp/remote/blockingUDPTransport.cpp | 9 +- pvAccessApp/remote/remote.h | 10 +- .../remote/simpleChannelSearchManagerImpl.h | 6 +- .../remoteClient/clientContextImpl.cpp | 187 ++++++++---------- .../server/beaconServerStatusProvider.cpp | 31 ++- pvAccessApp/server/responseHandlers.cpp | 46 ++--- pvAccessApp/server/responseHandlers.h | 36 ++-- pvAccessApp/utils/introspectionRegistry.cpp | 26 +-- pvAccessApp/utils/introspectionRegistry.h | 4 +- testApp/remote/eget.cpp | 86 ++++---- testApp/remote/pvget.cpp | 56 +++--- testApp/remote/pvput.cpp | 56 +++--- testApp/remote/pvrpc.cpp | 8 +- testApp/remote/testBlockingTCPClnt.cpp | 2 +- testApp/remote/testBlockingTCPSrv.cpp | 2 +- testApp/remote/testBlockingUDPClnt.cpp | 2 +- testApp/remote/testBlockingUDPSrv.cpp | 6 +- testApp/remote/testChannelConnect.cpp | 2 +- testApp/remote/testGetPerformance.cpp | 154 +++++++++++---- testApp/remote/testRemoteClientImpl.cpp | 33 ++-- testApp/remote/testServer.cpp | 152 +++++++++----- testApp/utils/inetAddressUtilsTest.cpp | 4 +- 31 files changed, 742 insertions(+), 543 deletions(-) diff --git a/.cproject b/.cproject index 0e0c996..c4b2764 100644 --- a/.cproject +++ b/.cproject @@ -3,11 +3,11 @@ - - + + - + @@ -16,44 +16,28 @@ - - - - - - - - - - - @@ -302,44 +286,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - make - all - true - true - false - - - make - clean - true - true - false - - - make - - uninstall - true - true - false - - - make - - clean all DEBUG=1 - true - true - false - - - + + + - + diff --git a/README b/README index 33c3be4..70ab8bb 100644 --- a/README +++ b/README @@ -3,4 +3,21 @@ Define EPICS_BASE PVDATA_HOME -variables that points to EPICS base and pvDataCPP installation directory (includes and libraries) in configure/RELEASE. +variables that points to EPICS base and pvDataCPP installation directory (includes and libraries) in configure/RELEASE.local + +Google C++ Testing Framework +---------------------------- +Download: +http://code.google.com/p/googletest/ + +Extract, go to its root directory and in run: +export GTEST_DIR=$PWD +g++ -g -O3 -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc +g++ -g -O3 -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest_main.cc +ar -rv libgtest_main.a gtest_main.o gtest-all.o + +mkdir -p $EPICS_HOME/gtest/lib +cp -r ${GTEST_DIR}/include $EPICS_HOME/gtest +cp libgtest_main.a $EPICS_HOME/gtest/lib + +(you can use cmake, see gtest README) diff --git a/pvAccessApp/factory/CreateRequestFactory.cpp b/pvAccessApp/factory/CreateRequestFactory.cpp index 0450d03..7665a64 100644 --- a/pvAccessApp/factory/CreateRequestFactory.cpp +++ b/pvAccessApp/factory/CreateRequestFactory.cpp @@ -43,7 +43,7 @@ private: return findMatchingBrace(request,closeBrace,numOpen-1); } - static void createFieldRequest(PVStructure* pvParent,std::string request,bool fieldListOK) { + static void createFieldRequest(PVStructurePtr const & pvParent,std::string request,bool fieldListOK) { trim(request); if(request.length()<=0) return; size_t comma = request.find(','); @@ -57,9 +57,12 @@ private: THROW_BASE_EXCEPTION("mismatched { }"); } String fieldName = request.substr(0,openBrace); - std::auto_ptr pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0)); - createFieldRequest(pvStructure.get(),request.substr(openBrace+1,closeBrace-openBrace-1),false); - pvParent->appendPVField(pvStructure.release()); + + PVFieldPtrArray fields; + StringArray fieldNames; + PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields)); + createFieldRequest(pvStructure,request.substr(openBrace+1,closeBrace-openBrace-1),false); + pvParent->appendPVField(fieldName, pvStructure); if(request.length()>closeBrace+1) { if(request.at(closeBrace+1) != ',') { THROW_BASE_EXCEPTION("misssing , after }"); @@ -69,9 +72,9 @@ private: return; } if(openBracket==std::string::npos && fieldListOK) { - std::auto_ptr pvStringField(static_cast(getPVDataCreate()->createPVScalar(pvParent, "fieldList", pvString))); + PVStringPtr pvStringField(std::tr1::static_pointer_cast(getPVDataCreate()->createPVScalar(pvString))); pvStringField->put(request); - pvParent->appendPVField(pvStringField.release()); + pvParent->appendPVField("fieldList", pvStringField); return; } if(openBracket!=std::string::npos && (comma==std::string::npos || comma>openBracket)) { @@ -95,30 +98,32 @@ private: createLeafFieldRequest(pvParent,request); } - static void createLeafFieldRequest(PVStructure* pvParent,String request) { + static void createLeafFieldRequest(PVStructurePtr const & pvParent,String request) { size_t openBracket = request.find('['); String fullName = request; if(openBracket != std::string::npos) fullName = request.substr(0,openBracket); size_t indLast = fullName.rfind('.'); String fieldName = fullName; if(indLast>1 && indLast != std::string::npos) fieldName = fullName.substr(indLast+1); - std::auto_ptr pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0)); - std::auto_ptr pvLeaf(getPVDataCreate()->createPVStructure(pvStructure.get(),"leaf", 0)); - std::auto_ptr pvStringField(static_cast(getPVDataCreate()->createPVScalar(pvLeaf.get(), "source", pvString))); + PVFieldPtrArray fields; + StringArray fieldNames; + PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields)); + PVStructurePtr pvLeaf(getPVDataCreate()->createPVStructure(fieldNames, fields)); + PVStringPtr pvStringField(std::tr1::static_pointer_cast(getPVDataCreate()->createPVScalar(pvString))); pvStringField->put(fullName); - pvLeaf->appendPVField(pvStringField.release()); + pvLeaf->appendPVField("source", pvStringField); if(openBracket != std::string::npos) { size_t closeBracket = request.find(']'); if(closeBracket==std::string::npos) { THROW_BASE_EXCEPTION("option does not have matching []"); } - createRequestOptions(pvLeaf.get(),request.substr(openBracket+1, closeBracket-openBracket-1)); + createRequestOptions(pvLeaf,request.substr(openBracket+1, closeBracket-openBracket-1)); } - pvStructure->appendPVField(pvLeaf.release()); - pvParent->appendPVField(pvStructure.release()); + pvStructure->appendPVField("leaf", pvLeaf); + pvParent->appendPVField("fieldName", pvStructure); } - static void createRequestOptions(PVStructure* pvParent,std::string request) { + static void createRequestOptions(PVStructurePtr const & pvParent,std::string request) { trim(request); if(request.length()<=1) return; @@ -135,9 +140,9 @@ private: if (equalsPos != std::string::npos) { - std::auto_ptr pvStringField(static_cast(getPVDataCreate()->createPVScalar(pvParent, token.substr(0, equalsPos), pvString))); + PVStringPtr pvStringField(std::tr1::static_pointer_cast(getPVDataCreate()->createPVScalar(pvString))); pvStringField->put(token.substr(equalsPos+1)); - pvParent->appendPVField(pvStringField.release()); + pvParent->appendPVField(token.substr(0, equalsPos), pvStringField); } } } @@ -146,11 +151,13 @@ public: virtual PVStructure::shared_pointer createRequest(String request) { - static String emptyString; + static PVFieldPtrArray emptyFields; + static StringArray emptyFieldNames; + if (!request.empty()) trim(request); if (request.empty()) { - PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0)); + PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); return pvStructure; } @@ -159,7 +166,7 @@ public: size_t offsetPutField = request.find("putField("); size_t offsetGetField = request.find("getField("); - PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0)); + PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); if (offsetRecord != std::string::npos) { size_t offsetBegin = request.find('[', offsetRecord); @@ -167,9 +174,9 @@ public: if(offsetEnd == std::string::npos) { THROW_BASE_EXCEPTION("record[ does not have matching ]"); } - std::auto_ptr pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "record", 0)); - createRequestOptions(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1)); - pvStructure->appendPVField(pvStruct.release()); + PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); + createRequestOptions(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1)); + pvStructure->appendPVField("record", pvStruct); } if (offsetField != std::string::npos) { size_t offsetBegin = request.find('(', offsetField); @@ -177,9 +184,9 @@ public: if(offsetEnd == std::string::npos) { THROW_BASE_EXCEPTION("field( does not have matching )"); } - std::auto_ptr pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "field", 0)); - createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); - pvStructure->appendPVField(pvStruct.release()); + PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); + createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); + pvStructure->appendPVField("field", pvStruct); } if (offsetPutField != std::string::npos) { size_t offsetBegin = request.find('(', offsetPutField); @@ -187,9 +194,9 @@ public: if(offsetEnd == std::string::npos) { THROW_BASE_EXCEPTION("putField( does not have matching )"); } - std::auto_ptr pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "putField", 0)); - createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); - pvStructure->appendPVField(pvStruct.release()); + PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); + createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); + pvStructure->appendPVField("putField", pvStruct); } if (offsetGetField != std::string::npos) { size_t offsetBegin = request.find('(', offsetGetField); @@ -197,12 +204,12 @@ public: if(offsetEnd == std::string::npos) { THROW_BASE_EXCEPTION("getField( does not have matching )"); } - std::auto_ptr pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "getField", 0)); - createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); - pvStructure->appendPVField(pvStruct.release()); + PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields)); + createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true); + pvStructure->appendPVField("getField", pvStruct); } if (pvStructure.get()->getStructure()->getNumberFields()==0) { - createFieldRequest(pvStructure.get(),request,true); + createFieldRequest(pvStructure,request,true); } return pvStructure; } diff --git a/pvAccessApp/remote/abstractResponseHandler.cpp b/pvAccessApp/remote/abstractResponseHandler.cpp index ad00f88..8ec35a7 100644 --- a/pvAccessApp/remote/abstractResponseHandler.cpp +++ b/pvAccessApp/remote/abstractResponseHandler.cpp @@ -23,7 +23,7 @@ namespace epics { void AbstractResponseHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { if(_debug) { char ipAddrStr[48]; ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr)); diff --git a/pvAccessApp/remote/blockingClientTCPTransport.cpp b/pvAccessApp/remote/blockingClientTCPTransport.cpp index 6a8c9a3..064270d 100644 --- a/pvAccessApp/remote/blockingClientTCPTransport.cpp +++ b/pvAccessApp/remote/blockingClientTCPTransport.cpp @@ -42,7 +42,7 @@ namespace epics { acquire(client); // use immediate for clients - setSendQueueFlushStrategy(IMMEDIATE); + setSendQueueFlushStrategy(DELAYED); // setup connection timeout timer (watchdog) epicsTimeGetCurrent(&_aliveTimestamp); diff --git a/pvAccessApp/remote/blockingServerTCPTransport.cpp b/pvAccessApp/remote/blockingServerTCPTransport.cpp index d66862b..53f64fe 100644 --- a/pvAccessApp/remote/blockingServerTCPTransport.cpp +++ b/pvAccessApp/remote/blockingServerTCPTransport.cpp @@ -28,7 +28,8 @@ namespace pvAccess { _lastChannelSID(0) { // for performance testing - // setSendQueueFlushStrategy(IMMEDIATE); + setSendQueueFlushStrategy(DELAYED); + _delay = 0.000; // NOTE: priority not yet known, default priority is used to register/unregister // TODO implement priorities in Reactor... not that user will diff --git a/pvAccessApp/remote/blockingTCP.h b/pvAccessApp/remote/blockingTCP.h index 23c0618..f1be511 100644 --- a/pvAccessApp/remote/blockingTCP.h +++ b/pvAccessApp/remote/blockingTCP.h @@ -124,20 +124,20 @@ namespace epics { bool waitUntilVerified(double timeout); virtual void flush(bool lastMessageCompleted); - virtual void startMessage(epics::pvData::int8 command, int ensureCapacity); + virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity); virtual void endMessage(); virtual void flushSerializeBuffer() { flush(false); } - virtual void ensureBuffer(int size); + virtual void ensureBuffer(std::size_t size); - virtual void alignBuffer(int alignment); + virtual void alignBuffer(std::size_t alignment); - virtual void ensureData(int size); + virtual void ensureData(std::size_t size); - virtual void alignData(int alignment); + virtual void alignData(std::size_t alignment); virtual void close(bool force); @@ -165,10 +165,15 @@ namespace epics { //void enqueueMonitorSendRequest(TransportSender::shared_pointer const & sender); + virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender); + + virtual void flushSendQueue(); + + protected: virtual void processReadCached(bool nestedCall, - ReceiveStage inStage, int requiredBytes); + ReceiveStage inStage, std::size_t requiredBytes); /** * Called to any resources just before closing transport @@ -199,11 +204,12 @@ namespace epics { /** * Default marker period. */ - static const int MARKER_PERIOD = 1024; + static const std::size_t MARKER_PERIOD = 1024; - static const int MAX_ENSURE_DATA_BUFFER_SIZE = 1024; + static const std::size_t MAX_ENSURE_DATA_BUFFER_SIZE = 1024; - static const double _delay; +// TODO + double _delay; /****** finally initialized at construction time and after start (called by the same thread) ********/ @@ -230,10 +236,12 @@ namespace epics { */ std::auto_ptr _responseHandler; + // TODO review int vs std::size_t + /** * Send buffer size. */ - int _maxPayloadSize; + std::size_t _maxPayloadSize; /** * Send buffer size. @@ -333,16 +341,16 @@ namespace epics { // initialized at construction time epics::pvData::ByteBuffer* _socketBuffer; - int _startPosition; + std::size_t _startPosition; - int _storedPayloadSize; - int _storedPosition; - int _storedLimit; + std::size_t _storedPayloadSize; + std::size_t _storedPosition; + std::size_t _storedLimit; epics::pvData::int8 _version; epics::pvData::int8 _packetType; epics::pvData::int8 _command; - int _payloadSize; + std::size_t _payloadSize; ReceiveStage _stage; diff --git a/pvAccessApp/remote/blockingTCPTransport.cpp b/pvAccessApp/remote/blockingTCPTransport.cpp index 51c18d6..1bec0f1 100644 --- a/pvAccessApp/remote/blockingTCPTransport.cpp +++ b/pvAccessApp/remote/blockingTCPTransport.cpp @@ -76,11 +76,12 @@ namespace pvAccess { PVDATA_REFCOUNT_MONITOR_DEFINE(blockingTCPTransport); - const double BlockingTCPTransport::_delay = 0.01; + //const double BlockingTCPTransport::_delay = 0.000; BlockingTCPTransport::BlockingTCPTransport(Context::shared_pointer const & context, SOCKET channel, std::auto_ptr& responseHandler, int receiveBufferSize, int16 priority) : + _delay(0.0), _channel(channel), _priority(priority), _responseHandler(responseHandler), @@ -221,7 +222,7 @@ namespace pvAccess { LOG(logLevelDebug, "Starting thread: %s",threadName.c_str()); _sendThreadId = epicsThreadCreate(threadName.c_str(), - epicsThreadPriorityMedium, + epicsThreadPriorityMedium, epicsThreadGetStackSize(epicsThreadStackMedium), BlockingTCPTransport::sendThreadRunner, this); } @@ -330,7 +331,7 @@ namespace pvAccess { startMessage(_lastSegmentedMessageCommand, 0); } - void BlockingTCPTransport::startMessage(int8 command, int ensureCapacity) { + void BlockingTCPTransport::startMessage(int8 command, size_t ensureCapacity) { _lastMessageStartPosition = -1; ensureBuffer(CA_MESSAGE_HEADER_SIZE+ensureCapacity); _lastMessageStartPosition = _sendBuffer->getPosition(); @@ -346,8 +347,8 @@ namespace pvAccess { endMessage(false); } - void BlockingTCPTransport::ensureBuffer(int size) { - if(likely((int)(_sendBuffer->getRemaining())>=size)) return; + void BlockingTCPTransport::ensureBuffer(size_t size) { + if(likely(_sendBuffer->getRemaining()>=size)) return; // too large for buffer... if(unlikely(_maxPayloadSizegetRemaining())getRemaining()getRemaining())<(alignment-1))) + if(unlikely(_sendBuffer->getRemaining()<(alignment-1))) ensureBuffer(alignment-1); _sendBuffer->align(alignment); @@ -425,9 +426,9 @@ namespace pvAccess { } } - void BlockingTCPTransport::ensureData(int size) { + void BlockingTCPTransport::ensureData(size_t size) { // enough of data? - if(likely(((int)_socketBuffer->getRemaining())>=size)) return; + if(likely(_socketBuffer->getRemaining()>=size)) return; // too large for buffer... if(unlikely(MAX_ENSURE_DATA_BUFFER_SIZEgetRemaining())getRemaining()getRemaining())<(alignment-1))) + if(unlikely(_socketBuffer->getRemaining()<(alignment-1))) ensureData(alignment-1); _socketBuffer->align(alignment); } void BlockingTCPTransport::processReadCached(bool nestedCall, - ReceiveStage inStage, int requiredBytes) { + ReceiveStage inStage, size_t requiredBytes) { try { while(likely(!_closed.get())) { if(_stage==READ_FROM_SOCKET||inStage!=UNDEFINED_STAGE) { @@ -521,7 +522,7 @@ namespace pvAccess { // read at least requiredBytes bytes - uintptr_t requiredPosition = (currentStartPosition+requiredBytes); + size_t requiredPosition = (currentStartPosition+requiredBytes); while(_socketBuffer->getPosition()getPosition(); @@ -689,7 +690,7 @@ namespace pvAccess { } _socketBuffer->setLimit(_storedLimit); - int newPosition = _storedPosition+_storedPayloadSize; + size_t newPosition = _storedPosition+_storedPayloadSize; if(unlikely(newPosition>_storedLimit)) { newPosition -= _storedLimit; _socketBuffer->setPosition(_storedLimit); @@ -778,6 +779,7 @@ namespace pvAccess { int bytesToSend = limit-buffer->getPosition(); //LOG(logLevelInfo,"Total bytes to send: %d", bytesToSend); + //printf("Total bytes to send: %d\n", bytesToSend); // limit sending if(bytesToSend>maxBytesToSend) { @@ -1010,6 +1012,18 @@ printf("sendThreadRunnner exception\n"); _sendQueueEvent.signal(); } + void BlockingTCPTransport::enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) { + Lock lock(_sendQueueMutex); + if(unlikely(_closed.get())) return; + _sendQueue.push_back(sender); + } + + void BlockingTCPTransport::flushSendQueue() { + Lock lock(_sendQueueMutex); + if(unlikely(_closed.get())) return; + _sendQueueEvent.signal(); + } + /* void BlockingTCPTransport::enqueueMonitorSendRequest(TransportSender::shared_pointer sender) { Lock lock(_monitorMutex); diff --git a/pvAccessApp/remote/blockingUDP.h b/pvAccessApp/remote/blockingUDP.h index e751293..a315d39 100644 --- a/pvAccessApp/remote/blockingUDP.h +++ b/pvAccessApp/remote/blockingUDP.h @@ -110,15 +110,15 @@ namespace epics { virtual void close(bool forced); - virtual void ensureData(int size) { + virtual void ensureData(std::size_t size) { // noop } - virtual void alignData(int alignment) { + virtual void alignData(std::size_t alignment) { _receiveBuffer->align(alignment); } - virtual void startMessage(epics::pvData::int8 command, int ensureCapacity); + virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity); virtual void endMessage(); virtual void flush(bool lastMessageCompleted) { @@ -134,11 +134,11 @@ namespace epics { // noop } - virtual void ensureBuffer(int size) { + virtual void ensureBuffer(std::size_t size) { // noop } - virtual void alignBuffer(int alignment) { + virtual void alignBuffer(std::size_t alignment) { _sendBuffer->align(alignment); } diff --git a/pvAccessApp/remote/blockingUDPTransport.cpp b/pvAccessApp/remote/blockingUDPTransport.cpp index a490192..4b724e3 100644 --- a/pvAccessApp/remote/blockingUDPTransport.cpp +++ b/pvAccessApp/remote/blockingUDPTransport.cpp @@ -141,7 +141,7 @@ namespace epics { } } - void BlockingUDPTransport::startMessage(int8 command, int ensureCapacity) { + void BlockingUDPTransport::startMessage(int8 command, size_t ensureCapacity) { _lastMessageStartPosition = _sendBuffer->getPosition(); _sendBuffer->putByte(CA_MAGIC); _sendBuffer->putByte(CA_VERSION); @@ -276,11 +276,12 @@ namespace epics { // command ID and paylaod int8 command = receiveBuffer->getByte(); - int payloadSize = receiveBuffer->getInt(); - int nextRequestPosition = receiveBuffer->getPosition() + payloadSize; + // TODO check this cast (size_t must be 32-bit) + size_t payloadSize = receiveBuffer->getInt(); + size_t nextRequestPosition = receiveBuffer->getPosition() + payloadSize; // payload size check - if(unlikely(nextRequestPosition>(int)receiveBuffer->getLimit())) return false; + if(unlikely(nextRequestPosition>receiveBuffer->getLimit())) return false; // handle _responseHandler->handleResponse(&fromAddress, thisTransport, diff --git a/pvAccessApp/remote/remote.h b/pvAccessApp/remote/remote.h index 0f17ee8..e0df5a2 100644 --- a/pvAccessApp/remote/remote.h +++ b/pvAccessApp/remote/remote.h @@ -111,7 +111,7 @@ namespace epics { virtual ~TransportSendControl() {} - virtual void startMessage(epics::pvData::int8 command, int ensureCapacity) = 0; + virtual void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity) = 0; virtual void endMessage() = 0; virtual void flush(bool lastMessageCompleted) = 0; @@ -261,6 +261,10 @@ namespace epics { */ virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0; + virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) {}; + + virtual void flushSendQueue() {}; + }; class Channel; @@ -315,7 +319,7 @@ namespace epics { */ virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, - epics::pvData::int8 version, epics::pvData::int8 command, int payloadSize, + epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) = 0; }; @@ -335,7 +339,7 @@ namespace epics { virtual ~AbstractResponseHandler() {} virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, - epics::pvData::int8 version, epics::pvData::int8 command, int payloadSize, + epics::pvData::int8 version, epics::pvData::int8 command, std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); protected: diff --git a/pvAccessApp/remote/simpleChannelSearchManagerImpl.h b/pvAccessApp/remote/simpleChannelSearchManagerImpl.h index 1e6519d..267bfee 100644 --- a/pvAccessApp/remote/simpleChannelSearchManagerImpl.h +++ b/pvAccessApp/remote/simpleChannelSearchManagerImpl.h @@ -23,9 +23,9 @@ public: void endMessage() {} void flush(bool lastMessageCompleted) {} void setRecipient(const osiSockAddr& sendTo) {} - void startMessage(epics::pvData::int8 command, int ensureCapacity) {} - void ensureBuffer(int size) {} - void alignBuffer(int alignment) {} + void startMessage(epics::pvData::int8 command, std::size_t ensureCapacity) {} + void ensureBuffer(std::size_t) {} + void alignBuffer(std::size_t alignment) {} void flushSerializeBuffer() {} void cachedSerialize( const std::tr1::shared_ptr& field, epics::pvData::ByteBuffer* buffer) diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index c691fbe..a464732 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -30,6 +30,8 @@ #include #include +#include + using std::tr1::dynamic_pointer_cast; using std::tr1::static_pointer_cast; @@ -45,7 +47,7 @@ namespace epics { String emptyString; // TODO consider std::unordered_map - typedef std::map IOIDResponseRequestMap; + typedef std::tr1::unordered_map IOIDResponseRequestMap; #define EXCEPTION_GUARD(code) try { code; } \ @@ -88,7 +90,7 @@ namespace epics { typedef std::tr1::shared_ptr shared_pointer; typedef std::tr1::shared_ptr const_shared_pointer; - static PVDataCreate* pvDataCreate; + static PVDataCreatePtr pvDataCreate; static Status notInitializedStatus; static Status destroyedStatus; @@ -290,7 +292,7 @@ namespace epics { - PVDataCreate* BaseRequestImpl::pvDataCreate = getPVDataCreate(); + PVDataCreatePtr BaseRequestImpl::pvDataCreate = getPVDataCreate(); Status BaseRequestImpl::notInitializedStatus = Status(Status::STATUSTYPE_ERROR, "request not initialized"); Status BaseRequestImpl::destroyedStatus = Status(Status::STATUSTYPE_ERROR, "request destroyed"); @@ -371,7 +373,7 @@ namespace epics { if (pendingRequest & QOS_INIT) { // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } stopRequest(); @@ -474,7 +476,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { ChannelGet::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); PVStructure::shared_pointer nullPVStructure; @@ -526,7 +528,7 @@ namespace epics { if (pendingRequest & QOS_INIT) { // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } stopRequest(); @@ -552,7 +554,7 @@ namespace epics { // create data and its bitSet { Lock lock(m_structureMutex); - m_structure.reset(transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); + m_structure = transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); m_bitSet.reset(new BitSet(m_structure->getNumberFields())); } @@ -593,7 +595,19 @@ namespace epics { return; } } - +/* +// TODO bulk hack + if (lastRequest) + { + try { + m_channel->checkAndGetTransport()->flushSendQueue(); + } catch (std::runtime_error &rte) { + stopRequest(); + EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected)); + } + return; + } + */ if (!startRequest(lastRequest ? QOS_DESTROY | QOS_GET : QOS_DEFAULT)) { EXCEPTION_GUARD(m_channelGetRequester->getDone(otherRequestPendingStatus)); return; @@ -602,6 +616,7 @@ namespace epics { try { TransportSender::shared_pointer thisSender = shared_from_this(); m_channel->checkAndGetTransport()->enqueueSendRequest(thisSender); + //TODO bulk hack m_channel->checkAndGetTransport()->enqueueOnlySendRequest(thisSender); } catch (std::runtime_error &rte) { stopRequest(); EXCEPTION_GUARD(m_channelGetRequester->getDone(channelNotConnected)); @@ -665,7 +680,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { ChannelPut::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); PVStructure::shared_pointer nullPVStructure; @@ -717,7 +732,7 @@ namespace epics { if (pendingRequest & QOS_INIT) { // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } else if (!(pendingRequest & QOS_GET)) { @@ -752,7 +767,7 @@ namespace epics { // create data and its bitSet { Lock lock(m_structureMutex); - m_structure.reset(transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); + m_structure = transport->getIntrospectionRegistry()->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); m_bitSet.reset(new BitSet(m_structure->getNumberFields())); } @@ -897,7 +912,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { ChannelPutGet::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); PVStructure::shared_pointer nullPVStructure; @@ -947,7 +962,7 @@ namespace epics { buffer->putByte((int8)QOS_INIT); // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } else if (pendingRequest & (QOS_GET | QOS_GET_PUT)) { // noop @@ -983,8 +998,8 @@ namespace epics { { Lock lock(m_structureMutex); - m_putData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); - m_getData.reset(registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get())); + m_putData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); + m_getData = registry->deserializeStructureAndCreatePVStructure(payloadBuffer, transport.get()); } // notify @@ -1186,7 +1201,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { ChannelRPC::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); EXCEPTION_GUARD(m_channelRPCRequester->channelRPCConnect(pvRequestNull, thisPointer)); @@ -1235,14 +1250,14 @@ namespace epics { buffer->putByte((int8)QOS_INIT); // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } else { { // no need to lock here, since it is already locked via TransportSender IF //Lock lock(m_structureMutex); - m_channel->getTransport()->getIntrospectionRegistry()->serializeStructure(buffer, control, m_structure.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializeStructure(buffer, control, m_structure); // release arguments structure m_structure.reset(); } @@ -1382,7 +1397,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { ChannelArray::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); PVArray::shared_pointer nullPVArray; @@ -1430,7 +1445,7 @@ namespace epics { if (pendingRequest & QOS_INIT) { // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } else if (pendingRequest & QOS_GET) { @@ -1476,7 +1491,7 @@ namespace epics { FieldConstPtr field = transport->getIntrospectionRegistry()->deserialize(payloadBuffer, transport.get()); { Lock lock(m_structureMutex); - m_structure.reset(dynamic_cast(getPVDataCreate()->createPVField(0, field))); + m_structure = dynamic_pointer_cast(getPVDataCreate()->createPVField(field)); } // notify @@ -1786,31 +1801,6 @@ namespace epics { - class MonitorElementImpl : public MonitorElement - { - public: - - PVStructure::shared_pointer m_pvStructure; - BitSet::shared_pointer m_changedBitSet; - BitSet::shared_pointer m_overrunBitSet; - - virtual PVStructure::shared_pointer const & getPVStructure() - { - return m_pvStructure; - } - - virtual BitSet::shared_pointer const & getChangedBitSet() - { - return m_changedBitSet; - } - - virtual BitSet::shared_pointer const & getOverrunBitSet() - { - return m_overrunBitSet; - } - }; - - class MonitorStrategy : public Monitor { public: virtual ~MonitorStrategy() {}; @@ -1837,7 +1827,7 @@ namespace epics { public: MonitorStrategyNotify(MonitorRequester::shared_pointer const & callback) : - m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElementImpl()) + m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElement()) { } @@ -1857,7 +1847,7 @@ namespace epics { m_callback->monitorEvent(thisMonitor); } - virtual MonitorElement::shared_pointer const & poll() { + virtual MonitorElement::shared_pointer poll() { Lock guard(m_mutex); if (m_gotMonitor) return m_nullMonitorElement; @@ -1865,7 +1855,7 @@ namespace epics { return m_monitorElement; } - virtual void release(MonitorElement::shared_pointer const & monitorElement) { + virtual void release(MonitorElement::shared_pointer & monitorElement) { Lock guard(m_mutex); m_gotMonitor = false; } @@ -1896,12 +1886,11 @@ namespace epics { MonitorElement::shared_pointer m_nullMonitorElement; MonitorElement::shared_pointer m_monitorElement; - std::tr1::shared_ptr m_monitorElementImpl; public: MonitorStrategyEntire(MonitorRequester::shared_pointer const & callback) : - m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElementImpl()), m_monitorElementImpl(static_pointer_cast(m_monitorElement)) + m_callback(callback), m_gotMonitor(false), m_mutex(), m_monitorElement(new MonitorElement()) { } @@ -1912,24 +1901,24 @@ namespace epics { virtual void init(StructureConstPtr const & structure) { Lock guard(m_mutex); - m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure)); - int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields(); - m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields)); - m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields)); + m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure); + int numberFields = m_monitorElement->pvStructurePtr->getNumberFields(); + m_monitorElement->changedBitSet.reset(new BitSet(numberFields)); + m_monitorElement->overrunBitSet.reset(new BitSet(numberFields)); } virtual void response(Transport::shared_pointer const & transport, ByteBuffer* payloadBuffer) { Lock guard(m_mutex); // simply deserialize and notify - m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get()); - m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get()); - m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get()); + m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get()); + m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get()); + m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get()); m_gotMonitor = true; Monitor::shared_pointer thisMonitor = shared_from_this(); m_callback->monitorEvent(thisMonitor); } - virtual MonitorElement::shared_pointer const & poll() { + virtual MonitorElement::shared_pointer poll() { Lock guard(m_mutex); if (m_gotMonitor) return m_nullMonitorElement; @@ -1937,7 +1926,7 @@ namespace epics { return m_monitorElement; } - virtual void release(MonitorElement::shared_pointer const & monitorElement) { + virtual void release(MonitorElement::shared_pointer & monitorElement) { Lock guard(m_mutex); m_gotMonitor = false; } @@ -1976,13 +1965,12 @@ namespace epics { MonitorElement::shared_pointer m_nullMonitorElement; MonitorElement::shared_pointer m_monitorElement; - std::tr1::shared_ptr m_monitorElementImpl; public: MonitorStrategySingle(MonitorRequester::shared_pointer callback) : m_callback(callback), m_gotMonitor(false), m_mutex(), - m_needToCompress(false), m_monitorElement(new MonitorElementImpl()), m_monitorElementImpl(static_pointer_cast(m_monitorElement)) + m_needToCompress(false), m_monitorElement(new MonitorElement()) { } @@ -1993,10 +1981,10 @@ namespace epics { virtual void init(StructureConstPtr const & structure) { Lock guard(m_mutex); - m_monitorElementImpl->m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, structure)); - int numberFields = m_monitorElementImpl->m_pvStructure->getNumberFields(); - m_monitorElementImpl->m_changedBitSet.reset(new BitSet(numberFields)); - m_monitorElementImpl->m_overrunBitSet.reset(new BitSet(numberFields)); + m_monitorElement->pvStructurePtr = getPVDataCreate()->createPVStructure(structure); + int numberFields = m_monitorElement->pvStructurePtr->getNumberFields(); + m_monitorElement->changedBitSet.reset(new BitSet(numberFields)); + m_monitorElement->overrunBitSet.reset(new BitSet(numberFields)); m_structureChangeBitSet.reset(new BitSet(numberFields)); m_structureOverrunBitSet.reset(new BitSet(numberFields)); @@ -2009,9 +1997,9 @@ namespace epics { if (!m_gotMonitor) { // simply deserialize and notify - m_monitorElementImpl->m_changedBitSet->deserialize(payloadBuffer, transport.get()); - m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_monitorElementImpl->m_changedBitSet.get()); - m_monitorElementImpl->m_overrunBitSet->deserialize(payloadBuffer, transport.get()); + m_monitorElement->changedBitSet->deserialize(payloadBuffer, transport.get()); + m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_monitorElement->changedBitSet.get()); + m_monitorElement->overrunBitSet->deserialize(payloadBuffer, transport.get()); m_gotMonitor = true; Monitor::shared_pointer thisMonitor = shared_from_this(); m_callback->monitorEvent(thisMonitor); @@ -2020,48 +2008,48 @@ namespace epics { { // deserialize first m_structureChangeBitSet->deserialize(payloadBuffer, transport.get()); - m_monitorElementImpl->m_pvStructure->deserialize(payloadBuffer, transport.get(), m_structureChangeBitSet.get()); + m_monitorElement->pvStructurePtr->deserialize(payloadBuffer, transport.get(), m_structureChangeBitSet.get()); m_structureOverrunBitSet->deserialize(payloadBuffer, transport.get()); // OR local overrun // TODO should work only on uncompressed - m_monitorElementImpl->m_overrunBitSet->or_and(*m_structureChangeBitSet.get(), *m_monitorElementImpl->m_changedBitSet.get()); + m_monitorElement->overrunBitSet->or_and(*m_structureChangeBitSet.get(), *m_monitorElement->changedBitSet.get()); // OR new changes - *(m_monitorElementImpl->m_changedBitSet) |= *m_structureChangeBitSet.get(); + *(m_monitorElement->changedBitSet) |= *m_structureChangeBitSet.get(); // OR remote overrun - *(m_monitorElementImpl->m_overrunBitSet) |= *m_structureOverrunBitSet.get(); + *(m_monitorElement->overrunBitSet) |= *m_structureOverrunBitSet.get(); } } - virtual MonitorElement::shared_pointer const & poll() { + virtual MonitorElement::shared_pointer poll() { Lock guard(m_mutex); if (!m_gotMonitor) return m_nullMonitorElement; // compress if needed if (m_needToCompress) { - BitSetUtil::compress(m_monitorElementImpl->m_changedBitSet.get(), m_monitorElementImpl->m_pvStructure.get()); - BitSetUtil::compress(m_monitorElementImpl->m_overrunBitSet.get(), m_monitorElementImpl->m_pvStructure.get()); + BitSetUtil::compress(m_monitorElement->changedBitSet.get(), m_monitorElement->pvStructurePtr.get()); + BitSetUtil::compress(m_monitorElement->overrunBitSet.get(), m_monitorElement->pvStructurePtr.get()); m_needToCompress = false; } return m_monitorElement; } - virtual void release(MonitorElement::shared_pointer const & monitorElement) { + virtual void release(MonitorElement::shared_pointer & monitorElement) { Lock guard(m_mutex); m_gotMonitor = false; } Status start() { Lock guard(m_mutex); - if (!m_monitorElementImpl->m_changedBitSet.get()) + if (!m_monitorElement->changedBitSet.get()) return Status(Status::STATUSTYPE_ERROR, "Monitor not connected."); m_gotMonitor = false; - m_monitorElementImpl->m_changedBitSet->clear(); - m_monitorElementImpl->m_overrunBitSet->clear(); + m_monitorElement->changedBitSet->clear(); + m_monitorElement->overrunBitSet->clear(); return Status::Ok; } @@ -2104,7 +2092,7 @@ namespace epics { { BaseRequestImpl::activate(); - if (m_pvRequest.get() == 0) + if (m_pvRequest == 0) { Monitor::shared_pointer thisPointer = dynamic_pointer_cast(shared_from_this()); StructureConstPtr nullPVStructure; @@ -2113,10 +2101,10 @@ namespace epics { } int queueSize = 2; - PVField* pvField = m_pvRequest->getSubField("record.queueSize"); - if (pvField) { - PVString* pvString = dynamic_cast(pvField); - if (pvString) + PVFieldPtr pvField = m_pvRequest->getSubField("record.queueSize"); + if (pvField.get()) { + PVStringPtr pvString = dynamic_pointer_cast(pvField); + if (pvString.get()) { String value = pvString->get(); @@ -2184,7 +2172,7 @@ namespace epics { if (pendingRequest & QOS_INIT) { // pvRequest - m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest.get()); + m_channel->getTransport()->getIntrospectionRegistry()->serializePVRequest(buffer, control, m_pvRequest); } stopRequest(); @@ -2336,12 +2324,12 @@ namespace epics { BaseRequestImpl::destroy(); } - virtual MonitorElement::shared_pointer const & poll() + virtual MonitorElement::shared_pointer poll() { return m_monitorStrategy->poll(); } - virtual void release(MonitorElement::shared_pointer const & monitorElement) + virtual void release(MonitorElement::shared_pointer & monitorElement) { m_monitorStrategy->release(monitorElement); } @@ -2396,7 +2384,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { char ipAddrStr[48]; ipAddrToDottedIP(&responseFrom->ia, ipAddrStr, sizeof(ipAddrStr)); @@ -2420,7 +2408,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2449,7 +2437,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2512,7 +2500,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { // reception timestamp TimeStamp timestamp; @@ -2560,17 +2548,16 @@ namespace epics { // TODO smart pointers // extra data - PVFieldPtr data = 0; + PVFieldPtr data; const FieldConstPtr field = IntrospectionRegistry::deserializeFull(payloadBuffer, transport.get()); if (field != 0) { - data = getPVDataCreate()->createPVField(0, field); + data = getPVDataCreate()->createPVField(field); data->deserialize(payloadBuffer, transport.get()); } // notify beacon handler beaconHandler->beaconNotify(responseFrom, version, ×tamp, &startupTimestamp, sequentalID, data); - if (data) delete data; } }; @@ -2586,7 +2573,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2616,7 +2603,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2653,7 +2640,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer) + size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer) { AbstractClientResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2734,7 +2721,7 @@ namespace epics { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { if (command < 0 || command >= (int8)m_handlerTable.size()) { @@ -3053,7 +3040,7 @@ namespace epics { virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } int32_t& getUserValue() { return m_userValue; } diff --git a/pvAccessApp/server/beaconServerStatusProvider.cpp b/pvAccessApp/server/beaconServerStatusProvider.cpp index 9ad7a7f..358d6cf 100644 --- a/pvAccessApp/server/beaconServerStatusProvider.cpp +++ b/pvAccessApp/server/beaconServerStatusProvider.cpp @@ -23,17 +23,28 @@ DefaultBeaconServerStatusProvider::~DefaultBeaconServerStatusProvider() void DefaultBeaconServerStatusProvider::initialize() { - FieldCreate* fieldCreate = getFieldCreate(); - FieldConstPtrArray fields = new FieldConstPtr[6]; - // TODO hierarchy can be used... - fields[0] = fieldCreate->createScalar("connections",pvInt); - fields[1] = fieldCreate->createScalar("allocatedMemory",pvLong); - fields[2] = fieldCreate->createScalar("freeMemory",pvLong); - fields[3] = fieldCreate->createScalar("threads",pvInt); - fields[4] = fieldCreate->createScalar("deadlocks",pvInt); - fields[5] = fieldCreate->createScalar("averageSystemLoad",pvDouble); + FieldCreatePtr fieldCreate = getFieldCreate(); - _status.reset(getPVDataCreate()->createPVStructure(0,"status",6,fields)); + StringArray fieldNames; + fieldNames.resize(6); + fieldNames[0] = "connections"; + fieldNames[1] = "allocatedMemory"; + fieldNames[2] = "freeMemory"; + fieldNames[3] = "threads"; + fieldNames[4] = "deadlocks"; + fieldNames[5] = "averageSystemLoad"; + + FieldConstPtrArray fields; + fields.resize(6); + // TODO hierarchy can be used... + fields[0] = fieldCreate->createScalar(pvInt); + fields[1] = fieldCreate->createScalar(pvLong); + fields[2] = fieldCreate->createScalar(pvLong); + fields[3] = fieldCreate->createScalar(pvInt); + fields[4] = fieldCreate->createScalar(pvInt); + fields[5] = fieldCreate->createScalar(pvDouble); + + _status = getPVDataCreate()->createPVStructure(fieldCreate->createStructure(fieldNames, fields)); } PVField::shared_pointer DefaultBeaconServerStatusProvider::getServerStatusData() diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index 988bb4c..1862885 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -28,7 +28,7 @@ namespace pvAccess { void ServerBadResponse::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -74,7 +74,7 @@ ServerResponseHandler::ServerResponseHandler(ServerContextImpl::shared_pointer c void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { if(command<0||command>=(int8)m_handlerTable.size()) { @@ -98,7 +98,7 @@ void ServerResponseHandler::handleResponse(osiSockAddr* responseFrom, void ServerConnectionValidationHandler::handleResponse( osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, - int8 command, int payloadSize, + int8 command, size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, @@ -116,7 +116,7 @@ void ServerConnectionValidationHandler::handleResponse( void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -128,7 +128,7 @@ void ServerEchoHandler::handleResponse(osiSockAddr* responseFrom, void ServerIntrospectionSearchHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -149,7 +149,7 @@ ServerSearchHandler::~ServerSearchHandler() void ServerSearchHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -273,7 +273,7 @@ void ServerChannelFindRequesterImpl::send(ByteBuffer* buffer, TransportSendContr /****************************************************************************************/ void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -424,7 +424,7 @@ String ServerChannelRequesterImpl::getRequesterName() void ServerChannelRequesterImpl::message(const String message, const MessageType messageType) { - LOG(logLevelDebug, "[%s] %s", messageTypeName[messageType].c_str(), message.c_str()); + LOG(logLevelDebug, "[%s] %s", getMessageTypeName(messageType).c_str(), message.c_str()); } void ServerChannelRequesterImpl::lock() @@ -479,7 +479,7 @@ void ServerChannelRequesterImpl::createChannelFailedResponse(ByteBuffer* buffer, void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -520,7 +520,7 @@ void ServerDestroyChannelHandler::handleResponse(osiSockAddr* responseFrom, void ServerGetHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -710,7 +710,7 @@ void ServerChannelGetRequesterImpl::send(ByteBuffer* buffer, TransportSendContro /****************************************************************************************/ void ServerPutHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -922,7 +922,7 @@ void ServerChannelPutRequesterImpl::send(ByteBuffer* buffer, TransportSendContro /****************************************************************************************/ void ServerPutGetHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1152,7 +1152,7 @@ void ServerChannelPutGetRequesterImpl::send(ByteBuffer* buffer, TransportSendCon /****************************************************************************************/ void ServerMonitorHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1246,7 +1246,7 @@ void ServerMonitorRequesterImpl::activate(PVStructure::shared_pointer const & pv INIT_EXCEPTION_GUARD(CMD_MONITOR, _channelMonitor = _channel->getChannel()->createMonitor(thisPointer, pvRequest)); } -void ServerMonitorRequesterImpl::monitorConnect(const Status& status, Monitor::shared_pointer const & monitor, epics::pvData::StructureConstPtr const & structure) +void ServerMonitorRequesterImpl::monitorConnect(const Status& status, Monitor::shared_pointer & monitor, epics::pvData::StructureConstPtr const & structure) { { Lock guard(_mutex); @@ -1352,14 +1352,14 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* buffer->putByte((int8)request); // changedBitSet and data, if not notify only (i.e. queueSize == -1) - BitSet::shared_pointer changedBitSet = element->getChangedBitSet(); + BitSet::shared_pointer changedBitSet = element->changedBitSet; if (changedBitSet != NULL) { changedBitSet->serialize(buffer, control); - element->getPVStructure()->serialize(buffer, control, changedBitSet.get()); + element->pvStructurePtr->serialize(buffer, control, changedBitSet.get()); // overrunBitset - element->getOverrunBitSet()->serialize(buffer, control); + element->overrunBitSet->serialize(buffer, control); } monitor->release(element); @@ -1370,7 +1370,7 @@ void ServerMonitorRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* /****************************************************************************************/ void ServerArrayHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1595,7 +1595,7 @@ void ServerChannelArrayRequesterImpl::send(ByteBuffer* buffer, TransportSendCont /****************************************************************************************/ void ServerCancelRequestHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1635,7 +1635,7 @@ void ServerCancelRequestHandler::failureResponse(Transport::shared_pointer const /****************************************************************************************/ void ServerProcessHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1794,7 +1794,7 @@ void ServerChannelProcessRequesterImpl::send(ByteBuffer* buffer, TransportSendCo /****************************************************************************************/ void ServerGetFieldHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -1873,7 +1873,7 @@ void ServerGetFieldRequesterImpl::send(ByteBuffer* buffer, TransportSendControl* /****************************************************************************************/ void ServerRPCHandler::handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, int8 version, int8 command, - int payloadSize, ByteBuffer* payloadBuffer) { + size_t payloadSize, ByteBuffer* payloadBuffer) { AbstractServerResponseHandler::handleResponse(responseFrom, transport, version, command, payloadSize, payloadBuffer); @@ -2034,7 +2034,7 @@ void ServerChannelRPCRequesterImpl::send(ByteBuffer* buffer, TransportSendContro } else { - introspectionRegistry->serializeStructure(buffer, control, _pvResponse.get()); + introspectionRegistry->serializeStructure(buffer, control, _pvResponse); } } } diff --git a/pvAccessApp/server/responseHandlers.h b/pvAccessApp/server/responseHandlers.h index 74921ba..d389c2f 100644 --- a/pvAccessApp/server/responseHandlers.h +++ b/pvAccessApp/server/responseHandlers.h @@ -43,7 +43,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; /** @@ -58,7 +58,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); private: /** * Table of response handlers for each command ID. @@ -78,7 +78,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; /** @@ -102,7 +102,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class EchoTransportSender : public TransportSender { @@ -142,7 +142,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; /****************************************************************************************/ @@ -161,7 +161,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); private: std::vector _providers; @@ -208,7 +208,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); private: void disconnect(Transport::shared_pointer const & transport); @@ -257,7 +257,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; @@ -299,7 +299,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelGetRequesterImpl : @@ -352,7 +352,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelPutRequesterImpl : @@ -405,7 +405,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelPutGetRequesterImpl : @@ -459,7 +459,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; @@ -482,7 +482,7 @@ namespace pvAccess { ServerChannelImpl::shared_pointer const & channel, const pvAccessID ioid, Transport::shared_pointer const & transport,epics::pvData::PVStructure::shared_pointer const & pvRequest); - void monitorConnect(const epics::pvData::Status& status, epics::pvData::Monitor::shared_pointer const & monitor, epics::pvData::StructureConstPtr const & structure); + void monitorConnect(const epics::pvData::Status& status, epics::pvData::Monitor::shared_pointer & monitor, epics::pvData::StructureConstPtr const & structure); void unlisten(epics::pvData::Monitor::shared_pointer const & monitor); void monitorEvent(epics::pvData::Monitor::shared_pointer const & monitor); void lock(); @@ -511,7 +511,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelArrayRequesterImpl : @@ -565,7 +565,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); private: void failureResponse(Transport::shared_pointer const & transport, pvAccessID ioid, const epics::pvData::Status& errorStatus); @@ -585,7 +585,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelProcessRequesterImpl : @@ -634,7 +634,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); private: void getFieldFailureResponse(Transport::shared_pointer const & transport, const pvAccessID ioid, const epics::pvData::Status& errorStatus); }; @@ -706,7 +706,7 @@ namespace pvAccess { virtual void handleResponse(osiSockAddr* responseFrom, Transport::shared_pointer const & transport, epics::pvData::int8 version, epics::pvData::int8 command, - int payloadSize, epics::pvData::ByteBuffer* payloadBuffer); + std::size_t payloadSize, epics::pvData::ByteBuffer* payloadBuffer); }; class ServerChannelRPCRequesterImpl : diff --git a/pvAccessApp/utils/introspectionRegistry.cpp b/pvAccessApp/utils/introspectionRegistry.cpp index b3af587..a472574 100644 --- a/pvAccessApp/utils/introspectionRegistry.cpp +++ b/pvAccessApp/utils/introspectionRegistry.cpp @@ -17,15 +17,11 @@ namespace pvAccess { const int8 IntrospectionRegistry::NULL_TYPE_CODE = (int8)-1; const int8 IntrospectionRegistry::ONLY_ID_TYPE_CODE = (int8)-2; const int8 IntrospectionRegistry::FULL_WITH_ID_TYPE_CODE = (int8)-3; -PVDataCreate* IntrospectionRegistry::_pvDataCreate = 0; -FieldCreate* IntrospectionRegistry::_fieldCreate = 0; +PVDataCreatePtr IntrospectionRegistry::_pvDataCreate (getPVDataCreate()); +FieldCreatePtr IntrospectionRegistry::_fieldCreate(getFieldCreate()); IntrospectionRegistry::IntrospectionRegistry(bool serverSide) { - // TODO not optimal - _pvDataCreate = getPVDataCreate(); - _fieldCreate = getFieldCreate(); - _direction = serverSide ? 1 : -1; reset(); } @@ -181,7 +177,7 @@ void IntrospectionRegistry::serialize(FieldConstPtr field, StructureConstPtr par FieldConstPtr IntrospectionRegistry::deserialize(ByteBuffer* buffer, DeserializableControl* control, IntrospectionRegistry* registry) { control->ensureData(1); - uintptr_t pos = buffer->getPosition(); + size_t pos = buffer->getPosition(); const int8 typeCode = buffer->getByte(); if(typeCode == IntrospectionRegistry::NULL_TYPE_CODE) { @@ -225,12 +221,11 @@ void IntrospectionRegistry::serializeStructure(ByteBuffer* buffer, SerializableC PVStructurePtr IntrospectionRegistry::deserializeStructure(ByteBuffer* buffer, DeserializableControl* control) { - PVStructurePtr pvStructure = NULL; + PVStructurePtr pvStructure; FieldConstPtr structureField = deserialize(buffer, control); - if (structureField != NULL) + if (structureField.get() != NULL) { - pvStructure = _pvDataCreate->createPVStructure(NULL, - static_pointer_cast(structureField)); + pvStructure = _pvDataCreate->createPVStructure(static_pointer_cast(structureField)); pvStructure->deserialize(buffer, control); } return pvStructure; @@ -252,12 +247,9 @@ PVStructurePtr IntrospectionRegistry::deserializeStructureAndCreatePVStructure(B { FieldConstPtr field = deserialize(buffer, control); if (field == NULL) - { - return NULL; - } - PVStructurePtr retVal = _pvDataCreate->createPVStructure(NULL, - static_pointer_cast(field)); - return retVal; + return PVStructurePtr(); + + return _pvDataCreate->createPVStructure(static_pointer_cast(field)); } void IntrospectionRegistry::serializeStatus(ByteBuffer* buffer, SerializableControl* control, const Status& status) diff --git a/pvAccessApp/utils/introspectionRegistry.h b/pvAccessApp/utils/introspectionRegistry.h index b99f5f0..ba0314f 100644 --- a/pvAccessApp/utils/introspectionRegistry.h +++ b/pvAccessApp/utils/introspectionRegistry.h @@ -211,12 +211,12 @@ typedef std::map registryMap_t; /** * PVField factory. */ - static epics::pvData::PVDataCreate* _pvDataCreate; + static epics::pvData::PVDataCreatePtr _pvDataCreate; /** * Field factory. */ - static epics::pvData::FieldCreate* _fieldCreate; + static epics::pvData::FieldCreatePtr _fieldCreate; bool registryContainsValue(epics::pvData::FieldConstPtr field, short& key); }; diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index 31b6f75..2961b19 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -124,13 +124,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) { PVFieldPtrArray fieldsData = data->getPVFields(); - if (fieldsData != 0) { - int length = data->getStructure()->getNumberFields(); - for(int i=0; igetStructure()->getNumberFields(); + for(int i=0; i(pv); BooleanArrayData data = BooleanArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { BooleanArray value = data.data; if(value[data.offset]) { @@ -163,9 +161,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVByteArray *pvdata = static_cast(pv); ByteArrayData data = ByteArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -182,9 +180,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVShortArray *pvdata = static_cast(pv); ShortArrayData data = ShortArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -201,9 +199,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVIntArray *pvdata = static_cast(pv); IntArrayData data = IntArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -220,9 +218,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVLongArray *pvdata = static_cast(pv); LongArrayData data = LongArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int64 val = data.data[data.offset]; char buf[16]; @@ -239,9 +237,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVFloatArray *pvdata = static_cast(pv); FloatArrayData data = FloatArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { float val = data.data[data.offset]; char buf[16]; @@ -258,9 +256,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVDoubleArray *pvdata = static_cast(pv); DoubleArrayData data = DoubleArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { double val = data.data[data.offset]; char buf[16]; @@ -277,9 +275,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVStringArray *pvdata = static_cast(pv); StringArrayData data = StringArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); StringArray value = data.data; if(num==1) { if(value[data.offset].length()>0) { @@ -307,13 +305,13 @@ void convertStructureArray(StringBuilder buffer, return; } StructureArrayData data = StructureArrayData(); - pvdata->get(0, length, &data); + pvdata->get(0, length, data); for (int i = 0; i < length; i++) { - PVStructure *pvStructure = data.data[i]; + PVStructurePtr pvStructure = data.data[i]; if (pvStructure == 0) { *buffer += "null"; } else { - convertToString(buffer,pvStructure,notFirst+1); + convertToString(buffer,pvStructure.get(),notFirst+1); } } } @@ -369,8 +367,8 @@ char *url_encode(char *str) { void formatNTTable(StringBuilder buffer, PVStructure *pvStruct) { - PVStringArray* labels = static_cast(pvStruct->getScalarArrayField("labels", pvString)); - if (labels == 0) + PVStringArrayPtr labels = static_pointer_cast(pvStruct->getScalarArrayField("labels", pvString)); + if (labels.get() == 0) return; // TODO int numColumns = labels->getLength(); @@ -379,23 +377,24 @@ void formatNTTable(StringBuilder buffer, PVStructure *pvStruct) // next numColumns fields are columns int maxValues = 0; - vector columnData; +// vector columnData; + vector*> columnData; PVFieldPtrArray fields = pvStruct->getPVFields(); for (int i = 0; i < numColumns; i++) { DoubleArrayData values; // TODO we relay on field ordering here (normativeType, labels, ) - PVDoubleArray* arrayField = static_cast(fields[i+2]); - int count = arrayField->get(0, arrayField->getLength(), &values); + PVDoubleArrayPtr arrayField = static_pointer_cast(fields[i+2]); + int count = arrayField->get(0, arrayField->getLength(), values); if (count > maxValues) maxValues = count; - columnData.push_back(values); + columnData.push_back(&values.data); } std::cout << std::left; // first print labels StringArrayData data; - labels->get(0, numColumns, &data); + labels->get(0, numColumns, data); for (int i = 0; i < numColumns; i++) { std::cout << std::setw(16) << data.data[i]; @@ -408,7 +407,8 @@ void formatNTTable(StringBuilder buffer, PVStructure *pvStruct) { for (int i = 0; i < numColumns; i++) { - std::cout << std::setw(16) << columnData[i].data[r]; +// std::cout << std::setw(16) << columnData[i].data[r]; + std::cout << std::setw(16) << (*columnData[i])[r]; } std::cout << std::endl; } @@ -422,8 +422,8 @@ void toNTString(StringBuilder buffer, PVField *pv,int notFirst) { PVStructure* pvStruct = static_cast(pv); // TODO type check, getStringField is verbose - PVString* ntType = static_cast(pvStruct->getSubField("normativeType")); - if (ntType) + PVStringPtr ntType = static_pointer_cast(pvStruct->getSubField("normativeType")); + if (ntType.get()) { String value = ntType->get(); @@ -508,7 +508,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, @@ -610,7 +610,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC) @@ -713,7 +713,7 @@ public: virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) @@ -935,15 +935,17 @@ int main (int argc, char *argv[]) } int i = 0; - FieldConstPtrArray fields = new FieldConstPtr[parameters.size()]; + StringArray fieldNames(parameters.size()); + FieldConstPtrArray fields(parameters.size()); for (vector< pair >::iterator iter = parameters.begin(); iter != parameters.end(); iter++, i++) { - fields[i] = getFieldCreate()->createScalar(iter->first, pvString); + fieldNames[i] = iter->first; + fields[i] = getFieldCreate()->createScalar(pvString); } PVStructure::shared_pointer args( - new PVStructure(NULL, getFieldCreate()->createStructure("", parameters.size(), fields))); + new PVStructure(getFieldCreate()->createStructure(fieldNames, fields))); for (vector< pair >::iterator iter = parameters.begin(); iter != parameters.end(); iter++) diff --git a/testApp/remote/pvget.cpp b/testApp/remote/pvget.cpp index 009de83..6ab0990 100644 --- a/testApp/remote/pvget.cpp +++ b/testApp/remote/pvget.cpp @@ -123,16 +123,14 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) { PVFieldPtrArray fieldsData = data->getPVFields(); - if (fieldsData != 0) { - int length = data->getStructure()->getNumberFields(); - for(int i=0; igetStructure()->getNumberFields(); + for(int i=0; igetScalarArray(); ScalarType type = array->getElementType(); @@ -141,9 +139,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVBooleanArray *pvdata = static_cast(pv); BooleanArrayData data = BooleanArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { BooleanArray value = data.data; if(value[data.offset]) { @@ -162,9 +160,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVByteArray *pvdata = static_cast(pv); ByteArrayData data = ByteArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -181,9 +179,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVShortArray *pvdata = static_cast(pv); ShortArrayData data = ShortArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -200,9 +198,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVIntArray *pvdata = static_cast(pv); IntArrayData data = IntArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -219,9 +217,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVLongArray *pvdata = static_cast(pv); LongArrayData data = LongArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int64 val = data.data[data.offset]; char buf[16]; @@ -238,9 +236,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVFloatArray *pvdata = static_cast(pv); FloatArrayData data = FloatArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { float val = data.data[data.offset]; char buf[16]; @@ -257,9 +255,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVDoubleArray *pvdata = static_cast(pv); DoubleArrayData data = DoubleArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { double val = data.data[data.offset]; char buf[16]; @@ -276,9 +274,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVStringArray *pvdata = static_cast(pv); StringArrayData data = StringArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); StringArray value = data.data; if(num==1) { if(value[data.offset].length()>0) { @@ -306,13 +304,13 @@ void convertStructureArray(StringBuilder buffer, return; } StructureArrayData data = StructureArrayData(); - pvdata->get(0, length, &data); + pvdata->get(0, length, data); for (int i = 0; i < length; i++) { - PVStructure *pvStructure = data.data[i]; + PVStructurePtr pvStructure = data.data[i]; if (pvStructure == 0) { *buffer += "null"; } else { - convertToString(buffer,pvStructure,notFirst+1); + convertToString(buffer,pvStructure.get(),notFirst+1); } } } @@ -379,7 +377,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, @@ -475,7 +473,7 @@ public: virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) diff --git a/testApp/remote/pvput.cpp b/testApp/remote/pvput.cpp index 014f0e9..ea2d9d2 100644 --- a/testApp/remote/pvput.cpp +++ b/testApp/remote/pvput.cpp @@ -121,13 +121,11 @@ void convertToString(StringBuilder buffer,PVField * pv,int notFirst) void convertStructure(StringBuilder buffer,PVStructure *data,int notFirst) { PVFieldPtrArray fieldsData = data->getPVFields(); - if (fieldsData != 0) { - int length = data->getStructure()->getNumberFields(); - for(int i=0; igetStructure()->getNumberFields(); + for(int i=0; i(pv); BooleanArrayData data = BooleanArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { BooleanArray value = data.data; if(value[data.offset]) { @@ -160,9 +158,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVByteArray *pvdata = static_cast(pv); ByteArrayData data = ByteArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -179,9 +177,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVShortArray *pvdata = static_cast(pv); ShortArrayData data = ShortArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -198,9 +196,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVIntArray *pvdata = static_cast(pv); IntArrayData data = IntArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int val = data.data[data.offset]; char buf[16]; @@ -217,9 +215,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVLongArray *pvdata = static_cast(pv); LongArrayData data = LongArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { int64 val = data.data[data.offset]; char buf[16]; @@ -236,9 +234,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVFloatArray *pvdata = static_cast(pv); FloatArrayData data = FloatArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { float val = data.data[data.offset]; char buf[16]; @@ -255,9 +253,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVDoubleArray *pvdata = static_cast(pv); DoubleArrayData data = DoubleArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ','; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); if(num==1) { double val = data.data[data.offset]; char buf[16]; @@ -274,9 +272,9 @@ void convertArray(StringBuilder buffer,PVScalarArray * pv,int notFirst) PVStringArray *pvdata = static_cast(pv); StringArrayData data = StringArrayData(); *buffer += "["; - for(int i=0; i < pvdata->getLength(); i++) { + for(size_t i=0; i < pvdata->getLength(); i++) { if(i!=0) *buffer += ","; - int num = pvdata->get(i,1,&data); + int num = pvdata->get(i,1,data); StringArray value = data.data; if(num==1) { if(value[data.offset].length()>0) { @@ -304,13 +302,13 @@ void convertStructureArray(StringBuilder buffer, return; } StructureArrayData data = StructureArrayData(); - pvdata->get(0, length, &data); + pvdata->get(0, length, data); for (int i = 0; i < length; i++) { - PVStructure *pvStructure = data.data[i]; + PVStructurePtr pvStructure = data.data[i]; if (pvStructure == 0) { *buffer += "null"; } else { - convertToString(buffer,pvStructure,notFirst+1); + convertToString(buffer,pvStructure.get(),notFirst+1); } } } @@ -378,7 +376,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, @@ -485,7 +483,7 @@ public: virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) @@ -635,7 +633,7 @@ int main (int argc, char *argv[]) allOK &= putRequesterImpl->waitUntilDone(timeOut); if (allOK) { - getConvert()->fromString(putRequesterImpl->getStructure().get(), values); + getConvert()->fromString(putRequesterImpl->getStructure(), values); putRequesterImpl->resetEvent(); channelPut->put(false); diff --git a/testApp/remote/pvrpc.cpp b/testApp/remote/pvrpc.cpp index ffdd064..617c1fc 100644 --- a/testApp/remote/pvrpc.cpp +++ b/testApp/remote/pvrpc.cpp @@ -68,7 +68,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } void resetEvent() @@ -96,7 +96,7 @@ public: virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) @@ -243,8 +243,10 @@ int main (int argc, char *argv[]) shared_ptr rpcRequesterImpl(new ChannelRPCRequesterImpl(channel->getChannelName())); // A PVStructure is sent at ChannelRPC connect time but we don't use it, so send an empty one + StringArray fieldNames; + FieldConstPtrArray fields; PVStructure::shared_pointer nothing( - new PVStructure(NULL, getFieldCreate()->createStructure("nothing", 0, NULL))); + new PVStructure(getFieldCreate()->createStructure(fieldNames, fields))); ChannelRPC::shared_pointer channelRPC = channel->createChannelRPC(rpcRequesterImpl, nothing); allOK &= rpcRequesterImpl->waitUntilDone(timeOut); diff --git a/testApp/remote/testBlockingTCPClnt.cpp b/testApp/remote/testBlockingTCPClnt.cpp index 35a9c9e..0e0e1ad 100644 --- a/testApp/remote/testBlockingTCPClnt.cpp +++ b/testApp/remote/testBlockingTCPClnt.cpp @@ -73,7 +73,7 @@ public: } virtual void handleResponse(osiSockAddr* responseFrom, - Transport::shared_pointer const & transport, int8 version, int8 command, int payloadSize, + Transport::shared_pointer const & transport, int8 version, int8 command, std::size_t payloadSize, ByteBuffer* payloadBuffer) { if(command==CMD_CONNECTION_VALIDATION) transport->verified(); diff --git a/testApp/remote/testBlockingTCPSrv.cpp b/testApp/remote/testBlockingTCPSrv.cpp index 80aa4fa..ade36ce 100644 --- a/testApp/remote/testBlockingTCPSrv.cpp +++ b/testApp/remote/testBlockingTCPSrv.cpp @@ -40,7 +40,7 @@ private: class DummyResponseHandler : public ResponseHandler { public: virtual void handleResponse(osiSockAddr* responseFrom, - Transport::shared_pointer const & transport, int8 version, int8 command, int payloadSize, + Transport::shared_pointer const & transport, int8 version, int8 command, std::size_t payloadSize, ByteBuffer* payloadBuffer) { cout << "DummyResponseHandler::handleResponse" << endl; } diff --git a/testApp/remote/testBlockingUDPClnt.cpp b/testApp/remote/testBlockingUDPClnt.cpp index 84be47d..2c5e485 100644 --- a/testApp/remote/testBlockingUDPClnt.cpp +++ b/testApp/remote/testBlockingUDPClnt.cpp @@ -61,7 +61,7 @@ public: virtual ~DummyResponseHandler() {} virtual void handleResponse(osiSockAddr* responseFrom, - Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, + Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize, ByteBuffer* payloadBuffer) { } }; diff --git a/testApp/remote/testBlockingUDPSrv.cpp b/testApp/remote/testBlockingUDPSrv.cpp index 2fcdeb0..08f23e9 100644 --- a/testApp/remote/testBlockingUDPSrv.cpp +++ b/testApp/remote/testBlockingUDPSrv.cpp @@ -60,14 +60,14 @@ public: } virtual void handleResponse(osiSockAddr* responseFrom, - Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, + Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize, ByteBuffer* payloadBuffer); private: int packets; }; void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom, - Transport::shared_pointer const &, int8 version, int8 command, int payloadSize, + Transport::shared_pointer const &, int8 version, int8 command, std::size_t payloadSize, ByteBuffer* payloadBuffer) { std::ostringstream os; @@ -84,7 +84,7 @@ void DummyResponseHandler::handleResponse(osiSockAddr* responseFrom, char payload[50]; - for(int i = 0; iget(payload, 0, dataCount); os<<"Payload ("< getCs; +int channelCount = 0; +int allCount = 0; + +timeval startTime; + +void get_all() +{ + ChannelGet::shared_pointer last; + for (vector::const_iterator i = getCs.begin(); + i != getCs.end(); + i++) + { + (*i)->get(false); + last = *i; + } + last->get(true); +} + class ChannelGetRequesterImpl : public ChannelGetRequester { @@ -48,6 +69,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester PVStructure::shared_pointer m_pvStructure; BitSet::shared_pointer m_bitSet; Event m_event; + Event m_connectionEvent; String m_channelName; int m_count; @@ -64,7 +86,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelGetConnect(const epics::pvData::Status& status, @@ -83,11 +105,14 @@ class ChannelGetRequesterImpl : public ChannelGetRequester m_channelGet = channelGet; m_pvStructure = pvStructure; m_bitSet = bitSet; + + m_connectionEvent.signal(); +/* m_count = COUNT; gettimeofday(&m_startTime, NULL); - m_channelGet->get(false); +*/ } else { @@ -105,32 +130,43 @@ class ChannelGetRequesterImpl : public ChannelGetRequester std::cout << "[" << m_channelName << "] channel get: " << status.toString() << std::endl; } + channelCount++; + if (channelCount == CHANNELS) + { + allCount++; + channelCount = 0; + } +//printf("channelCount %d\n", channelCount); + + if (allCount == COUNT) + { + timeval endTime; + gettimeofday(&endTime, NULL); + + + long seconds, nseconds; + double duration; + seconds = endTime.tv_sec - startTime.tv_sec; + nseconds = endTime.tv_usec - startTime.tv_usec; + + duration = seconds + nseconds/1000000.0; + + printf("%5.6f seconds, %5.3f (x %d = %5.3f) gets/s\n", duration, COUNT/duration, CHANNELS, COUNT*CHANNELS/duration); + + allCount = 0; + gettimeofday(&startTime, NULL); + + get_all(); - //String str; - //m_pvStructure->toString(&str); - //std::cout << str << std::endl; - - //m_event.signal(); - - if (--m_count) - m_channelGet->get(false); - else - { - timeval endTime; - gettimeofday(&endTime, NULL); + } + else if (channelCount == 0) + { + + get_all(); + } - long seconds, nseconds; - double duration; - seconds = endTime.tv_sec - m_startTime.tv_sec; - nseconds = endTime.tv_usec - m_startTime.tv_usec; - duration = seconds + nseconds/1000000.0; - - printf("%5.6f seconds, %5.3f gets/s \n", duration, COUNT/duration); - - m_event.signal(); - } } else { @@ -139,10 +175,16 @@ class ChannelGetRequesterImpl : public ChannelGetRequester } - bool wait(double timeOut) +/* + void get() { return m_event.wait(timeOut); } +*/ + bool waitUntilConnected(double timeOut) + { + return m_connectionEvent.wait(timeOut); + } }; class ChannelRequesterImpl : public ChannelRequester @@ -159,7 +201,7 @@ public: virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, @@ -194,9 +236,10 @@ public: }; - int main (int argc, char *argv[]) { +printf("this does not work... since this impl. requires bulk get control... tODO\n"); +return -1; int opt; // getopt() current option setvbuf(stdout,NULL,_IOLBF,BUFSIZ); // Set stdout to line buffering @@ -233,14 +276,17 @@ int main (int argc, char *argv[]) } } - int nPvs = argc - optind; // Remaining arg list is PV name - if (nPvs < 1 || nPvs > 1) - { - fprintf(stderr, "No pv name specified. ('testGetPerformance -h' for help.)\n"); - return 1; - } + printf("%d channels of double array size of %d elements, %d repetitions per sample\n", CHANNELS, ARRAY_SIZE, COUNT); + + vector pvs; + char buf[64]; + for (int i = 0; i < CHANNELS; i++) + { + sprintf(buf, "array%d_%d", ARRAY_SIZE, i); + pvs.push_back(buf); + //printf("%s\n", buf); + } - string pvName = argv[optind]; // Copy PV name from command line try { pvRequest = getCreateRequest()->createRequest(request); @@ -257,33 +303,57 @@ int main (int argc, char *argv[]) ClientFactory::start(); ChannelProvider::shared_pointer provider = getChannelAccess()->getProvider("pvAccess"); + + vector chs; + + for (vector::iterator i = pvs.begin(); + i != pvs.end(); + i++) + { + + shared_ptr channelRequesterImpl(new ChannelRequesterImpl()); - Channel::shared_pointer channel = provider->createChannel(pvName, channelRequesterImpl); + Channel::shared_pointer channel = provider->createChannel(*i, channelRequesterImpl); + chs.push_back(channel); + } + for (vector::iterator i = chs.begin(); + i != chs.end(); + i++) + { + Channel::shared_pointer channel = *i; + shared_ptr channelRequesterImpl = dynamic_pointer_cast(channel->getChannelRequester()); if (channelRequesterImpl->waitUntilConnected(5.0)) { shared_ptr getRequesterImpl(new ChannelGetRequesterImpl(channel->getChannelName())); ChannelGet::shared_pointer channelGet = channel->createChannelGet(getRequesterImpl, pvRequest); - allOK &= getRequesterImpl->wait(timeOut); + allOK = getRequesterImpl->waitUntilConnected(timeOut); if (!allOK) { std::cout << "[" << channel->getChannelName() << "] failed to get all the gets" << std::endl; + return 1; } - channelGet->destroy(); + getCs.push_back(channelGet); + } else { - allOK = false; - channel->destroy(); std::cout << "[" << channel->getChannelName() << "] connection timeout" << std::endl; + return 1; } +} + std::cout << "all connected" << std::endl; - ClientFactory::stop(); + gettimeofday(&startTime, NULL); + get_all(); + + epicsThreadSleep(DEFAULT_TIMEOUT); + //ClientFactory::stop(); return allOK ? 0 : 1; } diff --git a/testApp/remote/testRemoteClientImpl.cpp b/testApp/remote/testRemoteClientImpl.cpp index 3ae3f57..3829f46 100644 --- a/testApp/remote/testRemoteClientImpl.cpp +++ b/testApp/remote/testRemoteClientImpl.cpp @@ -32,7 +32,7 @@ class ChannelRequesterImpl : public ChannelRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer const & channel) @@ -56,7 +56,7 @@ class GetFieldRequesterImpl : public GetFieldRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr const & field) @@ -91,7 +91,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelGetConnect(const epics::pvData::Status& status,ChannelGet::shared_pointer const & channelGet, @@ -141,7 +141,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, @@ -197,7 +197,7 @@ class ChannelPutGetRequesterImpl : public ChannelPutGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelPutGetConnect(const epics::pvData::Status& status, ChannelPutGet::shared_pointer const & channelPutGet, @@ -275,7 +275,7 @@ class ChannelRPCRequesterImpl : public ChannelRPCRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelRPCConnect(const epics::pvData::Status& status,ChannelRPC::shared_pointer const & channelRPC) @@ -314,7 +314,7 @@ class ChannelArrayRequesterImpl : public ChannelArrayRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelArrayConnect(const epics::pvData::Status& status,ChannelArray::shared_pointer const & channelArray, @@ -364,10 +364,10 @@ class MonitorRequesterImpl : public MonitorRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } - virtual void monitorConnect(const epics::pvData::Status& status, Monitor::shared_pointer const & monitor, StructureConstPtr const & structure) + virtual void monitorConnect(const epics::pvData::Status& status, Monitor::shared_pointer & monitor, StructureConstPtr const & structure) { std::cout << "monitorConnect(" << status.toString() << ")" << std::endl; if (status.isSuccess() && structure) @@ -385,11 +385,11 @@ class MonitorRequesterImpl : public MonitorRequester MonitorElement::shared_pointer element = monitor->poll(); String str("changed/overrun "); - element->getChangedBitSet()->toString(&str); + element->changedBitSet->toString(&str); str += '/'; - element->getOverrunBitSet()->toString(&str); + element->overrunBitSet->toString(&str); str += '\n'; - element->getPVStructure()->toString(&str); + element->pvStructurePtr->toString(&str); std::cout << str << std::endl; monitor->release(element); @@ -413,7 +413,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess) @@ -526,10 +526,9 @@ int main(int argc,char *argv[]) { ChannelArrayRequester::shared_pointer channelArrayRequesterImpl(new ChannelArrayRequesterImpl()); - PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(0, "", 0)); - PVString* pvFieldName = (PVString*)getPVDataCreate()->createPVScalar(pvRequest.get(), "field", pvString); - pvFieldName->put("value"); - pvRequest->appendPVField(pvFieldName); + StringArray fieldNames(1); fieldNames.push_back("field"); + FieldConstPtrArray fields(1); fields.push_back(getFieldCreate()->createScalar(pvString)); + PVStructure::shared_pointer pvRequest(getPVDataCreate()->createPVStructure(getFieldCreate()->createStructure(fieldNames, fields))); ChannelArray::shared_pointer channelArray = channel->createChannelArray(channelArrayRequesterImpl, pvRequest); epicsThreadSleep ( 1.0 ); diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index aaecf04..2debcb8 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -28,7 +28,7 @@ class MockChannelProcess : private: ChannelProcessRequester::shared_pointer m_channelProcessRequester; PVStructure::shared_pointer m_pvStructure; - PVScalar* m_valueField; + PVScalarPtr m_valueField; protected: MockChannelProcess(ChannelProcessRequester::shared_pointer const & channelProcessRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) : @@ -37,8 +37,8 @@ class MockChannelProcess : PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelProcess); ChannelProcess::shared_pointer thisPtr; // we return null = static_pointer_cast(shared_from_this()); - PVField* field = pvStructure->getSubField(String("value")); - if (field == 0) + PVFieldPtr field = pvStructure->getSubField(String("value")); + if (field.get() == 0) { Status noValueFieldStatus(Status::STATUSTYPE_ERROR, "no 'value' field"); m_channelProcessRequester->channelProcessConnect(noValueFieldStatus, thisPtr); @@ -56,7 +56,7 @@ class MockChannelProcess : return; } - m_valueField = static_cast(field); + m_valueField = static_pointer_cast(field); } public: @@ -83,56 +83,56 @@ class MockChannelProcess : case pvBoolean: { // negate - PVBoolean *pvBoolean = static_cast(m_valueField); + PVBooleanPtr pvBoolean = static_pointer_cast(m_valueField); pvBoolean->put(!pvBoolean->get()); break; } case pvByte: { // increment by one - PVByte *pvByte = static_cast(m_valueField); + PVBytePtr pvByte = static_pointer_cast(m_valueField); pvByte->put(pvByte->get() + 1); break; } case pvShort: { // increment by one - PVShort *pvShort = static_cast(m_valueField); + PVShortPtr pvShort = static_pointer_cast(m_valueField); pvShort->put(pvShort->get() + 1); break; } case pvInt: { // increment by one - PVInt *pvInt = static_cast(m_valueField); + PVIntPtr pvInt = static_pointer_cast(m_valueField); pvInt->put(pvInt->get() + 1); break; } case pvLong: { // increment by one - PVLong *pvLong = static_cast(m_valueField); + PVLongPtr pvLong = static_pointer_cast(m_valueField); pvLong->put(pvLong->get() + 1); break; } case pvFloat: { // increment by one - PVFloat *pvFloat = static_cast(m_valueField); + PVFloatPtr pvFloat = static_pointer_cast(m_valueField); pvFloat->put(pvFloat->get() + 1.0f); break; } case pvDouble: { // increment by one - PVDouble *pvDouble = static_cast(m_valueField); + PVDoublePtr pvDouble = static_pointer_cast(m_valueField); pvDouble->put(pvDouble->get() + 1.0); break; } case pvString: { // increment by one - PVString *pvString = static_cast(m_valueField); + PVStringPtr pvString = static_pointer_cast(m_valueField); String val = pvString->get(); if (val.empty()) pvString->put("gen0"); @@ -404,8 +404,8 @@ class MockChannelRPC : public ChannelRPC if (m_channelName == "rpcNTTable") { // TODO type check, getStringField is verbose - PVString* columns = static_cast(pvArgument->getSubField("columns")); - if (columns == 0) + PVStringPtr columns = static_pointer_cast(pvArgument->getSubField("columns")); + if (columns.get() == 0) { PVStructure::shared_pointer nullPtr; Status errorStatus(Status::STATUSTYPE_ERROR, "no columns specified"); @@ -415,23 +415,27 @@ class MockChannelRPC : public ChannelRPC { int i = 0; int totalFields = 1 + 1 + atoi(columns->get().c_str()); // normativeType, labels, - FieldConstPtrArray fields = new FieldConstPtr[totalFields]; - fields[i++] = getFieldCreate()->createScalar("normativeType", pvString); - fields[i++] = getFieldCreate()->createScalarArray("labels", pvString); + StringArray fieldNames(totalFields); + FieldConstPtrArray fields(totalFields); + fieldNames[i] = "normativeType"; + fields[i++] = getFieldCreate()->createScalar(pvString); + fieldNames[i] = "labels"; + fields[i++] = getFieldCreate()->createScalarArray(pvString); char sbuf[16]; vector labels; for (; i < totalFields; i++) { sprintf(sbuf, "column%d", i-1 ); - fields[i] = getFieldCreate()->createScalarArray(sbuf, pvDouble); + fieldNames[i] = sbuf; + fields[i] = getFieldCreate()->createScalarArray(pvDouble); labels.push_back(sbuf); } PVStructure::shared_pointer result( - new PVStructure(NULL, getFieldCreate()->createStructure("", totalFields, fields))); + new PVStructure(getFieldCreate()->createStructure(fieldNames, fields))); result->getStringField("normativeType")->put("NTTable"); - static_cast(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0); + static_pointer_cast(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0); srand ( time(NULL) ); @@ -446,7 +450,7 @@ class MockChannelRPC : public ChannelRPC iter++) { FILL_VALUES; - static_cast(result->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0); + static_pointer_cast(result->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0); } m_channelRPCRequester->requestDone(Status::Ok, result); } @@ -499,7 +503,7 @@ class MockChannelArray : public ChannelArray protected: MockChannelArray(ChannelArrayRequester::shared_pointer const & channelArrayRequester, PVStructure::shared_pointer const & pvStructure, PVStructure::shared_pointer const & pvRequest) : m_channelArrayRequester(channelArrayRequester), - m_pvArray(getPVDataCreate()->createPVScalarArray(0, "", pvDouble)) + m_pvArray(getPVDataCreate()->createPVScalarArray(pvDouble)) { PVDATA_REFCOUNT_MONITOR_CONSTRUCT(mockChannelArray); } @@ -625,7 +629,7 @@ class MockMonitor : public Monitor, public MonitorElement, public std::tr1::enab return Status::Ok; } - virtual MonitorElement::shared_pointer const & poll() + virtual MonitorElement::shared_pointer poll() { Lock xx(m_lock); if (m_count) @@ -640,7 +644,7 @@ class MockMonitor : public Monitor, public MonitorElement, public std::tr1::enab } } - virtual void release(MonitorElement::shared_pointer const & monitorElement) + virtual void release(MonitorElement::shared_pointer & monitorElement) { Lock xx(m_lock); if (m_count) @@ -716,21 +720,62 @@ class MockChannel : public Channel { if (m_name.find("array") == 0) { - String allProperties("alarm,timeStamp,display,control"); - m_pvStructure.reset(getStandardPVField()->scalarArray(0,name,pvDouble,allProperties)); - PVDoubleArray *pvField = static_cast(m_pvStructure->getScalarArrayField(String("value"), pvDouble)); - double v = 0; - int ix = 0; - const int COUNT = 1000; + String allProperties(""); +// String allProperties("alarm,timeStamp,display,control"); + m_pvStructure = getStandardPVField()->scalarArray(pvDouble,allProperties); + PVDoubleArrayPtr pvField = static_pointer_cast(m_pvStructure->getScalarArrayField(String("value"), pvDouble)); - pvField->setCapacity(1000*COUNT); - for (int n = 0; n < 1000; n++) + int specCount = 0; char postfix[64]; + int done = sscanf(m_name.c_str(), "array%d%s", &specCount, postfix); + + if (done && specCount > 0) { - - double array[COUNT]; + pvField->setCapacity(specCount); + pvField->setLength(specCount); + } + else + { + double v = 0; + int ix = 0; + const int COUNT = 1024; + + pvField->setCapacity(1024*COUNT); + for (int n = 0; n < 1024; n++) + { + + double array[COUNT]; + for (int i = 0; i < COUNT; i++) + { + array[i] = v; v+=1.1; + } + pvField->put(ix, COUNT, array, 0); + ix += COUNT; + } + } + /* + printf("array prepared------------------------------------!!!\n"); + String str; + pvField->toString(&str); + printf("%s\n", str.c_str()); + printf("=============------------------------------------!!!\n"); + */ + } + else if (m_name.find("image") == 0) + { + String allProperties("alarm,timeStamp,display,control"); + m_pvStructure = getStandardPVField()->scalarArray(pvByte,allProperties); + PVByteArrayPtr pvField = static_pointer_cast(m_pvStructure->getScalarArrayField(String("value"), pvByte)); + int ix = 0; + const int COUNT = 1024; + + pvField->setCapacity(1024*COUNT); + for (int n = 0; n < 1024; n++) + { + + int8 array[COUNT]; for (int i = 0; i < COUNT; i++) { - array[i] = v; v+=1.1; + array[i] = ix; } pvField->put(ix, COUNT, array, 0); ix += COUNT; @@ -741,17 +786,24 @@ class MockChannel : public Channel { pvField->toString(&str); printf("%s\n", str.c_str()); printf("=============------------------------------------!!!\n"); - */ + */ } else if (m_name.find("rpc") == 0) { - m_pvStructure.reset(getPVDataCreate()->createPVStructure(0, name, 0, static_cast(0))); + StringArray fieldNames; + PVFieldPtrArray fields; + m_pvStructure = getPVDataCreate()->createPVStructure(fieldNames, fields); + } + else if (m_name.find("valueOnly") == 0) + { + String allProperties(""); + m_pvStructure = getStandardPVField()->scalar(pvDouble,allProperties); } else { String allProperties("alarm,timeStamp,display,control,valueAlarm"); - m_pvStructure.reset(getStandardPVField()->scalar(0,name,pvDouble,allProperties)); - PVDouble *pvField = m_pvStructure->getDoubleField(String("value")); + m_pvStructure = getStandardPVField()->scalar(pvDouble,allProperties); + PVDoublePtr pvField = m_pvStructure->getDoubleField(String("value")); pvField->put(1.123); } } @@ -788,7 +840,7 @@ class MockChannel : public Channel { virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual ChannelProvider::shared_pointer const & getProvider() @@ -831,7 +883,7 @@ class MockChannel : public Channel { PVFieldPtr pvField; if(subField == "") { - pvField = m_pvStructure.get(); + pvField = m_pvStructure; } else { @@ -1042,7 +1094,7 @@ class ChannelRequesterImpl : public ChannelRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelCreated(const epics::pvData::Status& status, Channel::shared_pointer &channel) @@ -1066,7 +1118,7 @@ class GetFieldRequesterImpl : public GetFieldRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void getDone(const epics::pvData::Status& status,epics::pvData::FieldConstPtr field) @@ -1097,7 +1149,7 @@ class ChannelGetRequesterImpl : public ChannelGetRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelGetConnect(const epics::pvData::Status& status, ChannelGet::shared_pointer const & channelGet, @@ -1133,7 +1185,7 @@ class ChannelPutRequesterImpl : public ChannelPutRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelPutConnect(const epics::pvData::Status& status,ChannelPut::shared_pointer const & channelPut, @@ -1176,7 +1228,7 @@ class MonitorRequesterImpl : public MonitorRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void monitorConnect(const Status& status, Monitor::shared_pointer const & monitor, StructureConstPtr& structure) @@ -1197,11 +1249,11 @@ class MonitorRequesterImpl : public MonitorRequester MonitorElement::shared_pointer element = monitor->poll(); String str("changed/overrun "); - element->getChangedBitSet()->toString(&str); + element->changedBitSet->toString(&str); str += '/'; - element->getOverrunBitSet()->toString(&str); + element->overrunBitSet->toString(&str); str += '\n'; - element->getPVStructure()->toString(&str); + element->pvStructurePtr->toString(&str); std::cout << str << std::endl; monitor->release(element); @@ -1225,7 +1277,7 @@ class ChannelProcessRequesterImpl : public ChannelProcessRequester virtual void message(String message,MessageType messageType) { - std::cout << "[" << getRequesterName() << "] message(" << message << ", " << messageTypeName[messageType] << ")" << std::endl; + std::cout << "[" << getRequesterName() << "] message(" << message << ", " << getMessageTypeName(messageType) << ")" << std::endl; } virtual void channelProcessConnect(const epics::pvData::Status& status,ChannelProcess::shared_pointer const & channelProcess) diff --git a/testApp/utils/inetAddressUtilsTest.cpp b/testApp/utils/inetAddressUtilsTest.cpp index eea147e..9147e6b 100644 --- a/testApp/utils/inetAddressUtilsTest.cpp +++ b/testApp/utils/inetAddressUtilsTest.cpp @@ -112,7 +112,7 @@ TEST(inetAddressUtils, encodeAsIPv6Address) osiSockAddr addr = *paddr; encodeAsIPv6Address(buff.get(), &addr); - ASSERT_EQ(static_cast(16), buff->getPosition()); + ASSERT_EQ(static_cast(16), buff->getPosition()); EXPECT_TRUE(strncmp(buff->getArray(), src, 16)==0); } @@ -134,4 +134,4 @@ TEST(inetAddressUtils, getBroadcastAddresses) cout<<"\t"<at(i))<