diff --git a/pvAccessApp/remote/beaconHandler.cpp b/pvAccessApp/remote/beaconHandler.cpp index 2fc2e7d..87142d0 100644 --- a/pvAccessApp/remote/beaconHandler.cpp +++ b/pvAccessApp/remote/beaconHandler.cpp @@ -14,7 +14,7 @@ using namespace epics::pvAccess; namespace epics { namespace pvAccess { -BeaconHandler::BeaconHandler(Context::shared_pointer context, +BeaconHandler::BeaconHandler(Context::shared_pointer const & context, const osiSockAddr* responseFrom) : _context(Context::weak_pointer(context)), _responseFrom(*responseFrom), @@ -42,10 +42,8 @@ void BeaconHandler::beaconNotify(osiSockAddr* from, int8 remoteTransportRevision PVFieldPtr data) { bool networkChanged = updateBeacon(remoteTransportRevision, timestamp, startupTime, sequentalID); - if(networkChanged) - { + if (networkChanged) changedTransport(); - } } bool BeaconHandler::updateBeacon(int8 remoteTransportRevision, TimeStamp* timestamp, @@ -58,10 +56,7 @@ bool BeaconHandler::updateBeacon(int8 remoteTransportRevision, TimeStamp* timest _serverStartupTime = *startupTime; // new server up.. - _context.lock()->beaconAnomalyNotify(); - - // notify corresponding transport(s) - beaconArrivalNotify(); + _context.lock()->newServerDetected(); return false; } @@ -69,30 +64,15 @@ bool BeaconHandler::updateBeacon(int8 remoteTransportRevision, TimeStamp* timest bool networkChange = !(_serverStartupTime == *startupTime); if (networkChange) { - _context.lock()->beaconAnomalyNotify(); - } - else - { - beaconArrivalNotify(); + // update startup time + _serverStartupTime = *startupTime; + + _context.lock()->newServerDetected(); + + return true; } - return networkChange; -} - -void BeaconHandler::beaconArrivalNotify() -{ - auto_ptr transports = - _context.lock()->getTransportRegistry()->get("TCP", &_responseFrom); - if (!transports.get()) - return; - - // notify all - for (TransportRegistry::transportVector_t::iterator iter = transports->begin(); - iter != transports->end(); - iter++) - { - (*iter)->aliveNotification(); - } + return false; } void BeaconHandler::changedTransport() diff --git a/pvAccessApp/remote/beaconHandler.h b/pvAccessApp/remote/beaconHandler.h index c2d169d..9b74f1b 100644 --- a/pvAccessApp/remote/beaconHandler.h +++ b/pvAccessApp/remote/beaconHandler.h @@ -23,15 +23,14 @@ namespace pvAccess { class BeaconHandler { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(BeaconHandler); /** * Constructor. * @param transport transport to be used to send beacons. * @param context CA context. */ - BeaconHandler(Context::shared_pointer context, const osiSockAddr* responseFrom); + BeaconHandler(Context::shared_pointer const & context, const osiSockAddr* responseFrom); /** * Test Constructor (for testing) * @param transport transport to be used to send beacons. @@ -81,10 +80,6 @@ namespace pvAccess { epics::pvData::TimeStamp* timestamp, epics::pvData::TimeStamp* startupTime, epics::pvData::int16 sequentalID); - /** - * Notify transport about beacon arrival. - */ - void beaconArrivalNotify(); /** * Changed transport (server restarted) notify. */ diff --git a/pvAccessApp/remote/blockingClientTCPTransport.cpp b/pvAccessApp/remote/blockingClientTCPTransport.cpp index 58da1de..45db3da 100644 --- a/pvAccessApp/remote/blockingClientTCPTransport.cpp +++ b/pvAccessApp/remote/blockingClientTCPTransport.cpp @@ -165,7 +165,7 @@ namespace epics { // not used anymore, close it // TODO consider delayed destruction (can improve performance!!!) - if(_owners.size()==0) close(false); + if(_owners.size()==0) close(); // TODO close(false) } void BlockingClientTCPTransport::aliveNotification() { diff --git a/pvAccessApp/remote/blockingTCP.h b/pvAccessApp/remote/blockingTCP.h index 0c1d7f9..d098405 100644 --- a/pvAccessApp/remote/blockingTCP.h +++ b/pvAccessApp/remote/blockingTCP.h @@ -57,19 +57,23 @@ namespace epics { return _closed.get(); } - virtual void setRemoteMinorRevision(epics::pvData::int8 minorRevision) { - _remoteTransportRevision = minorRevision; + virtual epics::pvData::int8 getRevision() const { + return CA_PROTOCOL_REVISION; } - virtual void setRemoteTransportReceiveBufferSize(int remoteTransportReceiveBufferSize) { + virtual void setRemoteRevision(epics::pvData::int8 revision) { + _remoteTransportRevision = revision; + } + + virtual void setRemoteTransportReceiveBufferSize(std::size_t remoteTransportReceiveBufferSize) { _remoteTransportReceiveBufferSize = remoteTransportReceiveBufferSize; } - virtual void setRemoteTransportSocketReceiveBufferSize(int socketReceiveBufferSize) { + virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize) { _remoteTransportSocketReceiveBufferSize = socketReceiveBufferSize; } - virtual const epics::pvData::String getType() const { + virtual epics::pvData::String getType() const { return epics::pvData::String("TCP"); } @@ -89,7 +93,7 @@ namespace epics { return _priority; } - virtual int getReceiveBufferSize() const { + virtual std::size_t getReceiveBufferSize() const { return _socketBuffer->getSize(); } @@ -97,15 +101,16 @@ namespace epics { * Get remote transport receive buffer size (in bytes). * @return remote transport receive buffer size */ - int getRemoteTransportReceiveBufferSize() { + virtual std::size_t getRemoteTransportReceiveBufferSize() const { return _remoteTransportReceiveBufferSize; } - virtual int getSocketReceiveBufferSize() const; + virtual std::size_t getSocketReceiveBufferSize() const; - virtual bool isVerified() { + virtual bool verify(epics::pvData::int32 timeoutMs) { epics::pvData::Lock lock(_verifiedMutex); return _verified; + // TODO !!! } virtual void verified() { @@ -139,7 +144,12 @@ namespace epics { virtual void alignData(std::size_t alignment); - virtual void close(bool force); + virtual void close(); + + virtual void setByteOrder(int byteOrder) + { + // TODO !!! + } SendQueueFlushStrategy getSendQueueFlushStrategy() { return _flushStrategy; @@ -459,12 +469,10 @@ namespace epics { class BlockingClientTCPTransport : public BlockingTCPTransport, public TransportSender, - public epics::pvData::TimerCallback, - public ReferenceCountingTransport { + public epics::pvData::TimerCallback { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(BlockingClientTCPTransport); private: BlockingClientTCPTransport(Context::shared_pointer const & context, SOCKET channel, @@ -596,6 +604,8 @@ namespace epics { */ class BlockingTCPConnector : public Connector { public: + POINTER_DEFINITIONS(BlockingTCPConnector); + BlockingTCPConnector(Context::shared_pointer const & context, int receiveBufferSize, float beaconInterval); @@ -645,8 +655,7 @@ namespace epics { public ChannelHostingTransport, public TransportSender { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(BlockingServerTCPTransport); private: BlockingServerTCPTransport(Context::shared_pointer const & context, SOCKET channel, @@ -662,6 +671,13 @@ namespace epics { return thisPointer; } + virtual bool acquire(std::tr1::shared_ptr const & client) + { + return false; + } + + virtual void release(pvAccessID clientId) {} + /** * Preallocate new channel SID. * @return new channel server id (SID). @@ -783,8 +799,7 @@ namespace epics { class ResponseHandlerFactory { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(ResponseHandlerFactory); virtual ~ResponseHandlerFactory() {}; @@ -798,8 +813,7 @@ namespace epics { */ class BlockingTCPAcceptor { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(BlockingTCPAcceptor); /** * @param context diff --git a/pvAccessApp/remote/blockingTCPAcceptor.cpp b/pvAccessApp/remote/blockingTCPAcceptor.cpp index 18d75de..120b43b 100644 --- a/pvAccessApp/remote/blockingTCPAcceptor.cpp +++ b/pvAccessApp/remote/blockingTCPAcceptor.cpp @@ -195,7 +195,7 @@ namespace pvAccess { // validate connection if(!validateConnection(transport, ipAddrStr)) { - transport->close(true); + transport->close(); LOG( logLevelDebug, "Connection to CA client %s failed to be validated, closing it.", diff --git a/pvAccessApp/remote/blockingTCPConnector.cpp b/pvAccessApp/remote/blockingTCPConnector.cpp index cdb7418..b43e413 100644 --- a/pvAccessApp/remote/blockingTCPConnector.cpp +++ b/pvAccessApp/remote/blockingTCPConnector.cpp @@ -163,13 +163,13 @@ namespace epics { return transport; } catch(std::exception& ex) { if(transport.get()) - transport->close(true); + transport->close(); else if(socket!=INVALID_SOCKET) epicsSocketDestroy(socket); _namedLocker.releaseSynchronizationObject(&address); throw; } catch(...) { if(transport.get()) - transport->close(true); + transport->close(); else if(socket!=INVALID_SOCKET) epicsSocketDestroy(socket); _namedLocker.releaseSynchronizationObject(&address); throw; diff --git a/pvAccessApp/remote/blockingTCPTransport.cpp b/pvAccessApp/remote/blockingTCPTransport.cpp index 05cca19..4c108e0 100644 --- a/pvAccessApp/remote/blockingTCPTransport.cpp +++ b/pvAccessApp/remote/blockingTCPTransport.cpp @@ -182,7 +182,7 @@ namespace pvAccess { BlockingTCPTransport::~BlockingTCPTransport() { PVACCESS_REFCOUNT_MONITOR_DESTRUCT(blockingTCPTransport); - close(true); + close(); // TODO use auto_ptr class members @@ -248,7 +248,7 @@ namespace pvAccess { _sendBuffer->putInt(0); } - void BlockingTCPTransport::close(bool force) { + void BlockingTCPTransport::close() { Lock lock(_mutex); // already closed check @@ -259,6 +259,9 @@ namespace pvAccess { Transport::shared_pointer thisSharedPtr = shared_from_this(); _context->getTransportRegistry()->remove(thisSharedPtr).get(); + // TODO !!! + bool force = true; + // clean resources internalClose(force); @@ -281,7 +284,7 @@ namespace pvAccess { void BlockingTCPTransport::internalPostClose(bool force) { } - int BlockingTCPTransport::getSocketReceiveBufferSize() const { + size_t BlockingTCPTransport::getSocketReceiveBufferSize() const { // Get value of the SO_RCVBUF option for this DatagramSocket, // that is the buffer size used by the platform for input on // this DatagramSocket. @@ -299,7 +302,7 @@ namespace pvAccess { errStr); } - return sockBufSize; + return (size_t)sockBufSize; } bool BlockingTCPTransport::waitUntilVerified(double timeout) { @@ -542,7 +545,7 @@ namespace pvAccess { } // error (disconnect, end-of-stream) detected - close(true); + close(); if(nestedCall) THROW_BASE_EXCEPTION("bytesRead < 0"); @@ -586,7 +589,7 @@ namespace pvAccess { logLevelError, "Invalid header received from client %s, disconnecting...", inetAddressToString(_socketAddress).c_str()); - close(true); + close(); return; } @@ -658,7 +661,7 @@ namespace pvAccess { "Unknown packet type %d, received from client %s, disconnecting...", type, inetAddressToString(_socketAddress).c_str()); - close(true); + close(); return; } } @@ -707,7 +710,7 @@ namespace pvAccess { } } catch(...) { // close connection - close(true); + close(); if(nestedCall) throw; } @@ -860,7 +863,7 @@ namespace pvAccess { // buffer->getPosition(), limit); } // while } catch(...) { - close(true); + close(); throw; } diff --git a/pvAccessApp/remote/blockingUDP.h b/pvAccessApp/remote/blockingUDP.h index f08df97..ac484ad 100644 --- a/pvAccessApp/remote/blockingUDP.h +++ b/pvAccessApp/remote/blockingUDP.h @@ -31,8 +31,7 @@ namespace epics { public std::tr1::enable_shared_from_this { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(BlockingUDPTransport); private: BlockingUDPTransport(std::auto_ptr& responseHandler, @@ -60,31 +59,35 @@ namespace epics { return &_bindAddress; } - virtual const epics::pvData::String getType() const { + virtual epics::pvData::String getType() const { return epics::pvData::String("UDP"); } - virtual int getReceiveBufferSize() const { + virtual std::size_t getReceiveBufferSize() const { return _receiveBuffer->getSize(); } - virtual int getSocketReceiveBufferSize() const; + virtual std::size_t getSocketReceiveBufferSize() const; virtual epics::pvData::int16 getPriority() const { return CA_DEFAULT_PRIORITY; } - virtual void setRemoteMinorRevision(epics::pvData::int8 minor) { + virtual epics::pvData::int8 getRevision() const { + return CA_PROTOCOL_REVISION; + } + + virtual void setRemoteRevision(epics::pvData::int8 revision) { // noop } virtual void setRemoteTransportReceiveBufferSize( - int receiveBufferSize) { + std::size_t receiveBufferSize) { // noop for UDP (limited by 64k; MAX_UDP_SEND for CA) } virtual void setRemoteTransportSocketReceiveBufferSize( - int socketReceiveBufferSize) { + std::size_t socketReceiveBufferSize) { // noop for UDP (limited by 64k; MAX_UDP_SEND for CA) } @@ -96,19 +99,24 @@ namespace epics { // noop } - virtual bool isVerified() { - return false; + virtual bool verify(epics::pvData::int32 timeoutMs) { + // noop + return true; } virtual void verified() { // noop } + virtual void setByteOrder(int byteOrder) { + // TODO + } + virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender); void start(); - virtual void close(bool forced); + virtual void close(); virtual void ensureData(std::size_t size) { // noop @@ -157,6 +165,13 @@ namespace epics { return epics::pvData::getFieldCreate()->deserialize(buffer, this); } + virtual bool acquire(std::tr1::shared_ptr const & client) + { + return false; + } + + virtual void release(pvAccessID clientId) {} + /** * Set ignore list. * @param addresses list of ignored addresses. @@ -232,7 +247,7 @@ namespace epics { bool processBuffer(Transport::shared_pointer const & transport, osiSockAddr& fromAddress, epics::pvData::ByteBuffer* receiveBuffer); - void close(bool forced, bool waitForThreadToComplete); + void close(bool waitForThreadToComplete); // Context only used for logging in this class @@ -295,6 +310,7 @@ namespace epics { public Connector, private epics::pvData::NoDefaultMethods { public: + POINTER_DEFINITIONS(BlockingUDPConnector); BlockingUDPConnector( bool reuseSocket, diff --git a/pvAccessApp/remote/blockingUDPTransport.cpp b/pvAccessApp/remote/blockingUDPTransport.cpp index 87d68bd..5d99808 100644 --- a/pvAccessApp/remote/blockingUDPTransport.cpp +++ b/pvAccessApp/remote/blockingUDPTransport.cpp @@ -89,11 +89,11 @@ namespace epics { BlockingUDPTransport::threadRunner, this); } - void BlockingUDPTransport::close(bool forced) { - close(forced, true); + void BlockingUDPTransport::close() { + close(true); } - void BlockingUDPTransport::close(bool forced, bool waitForThreadToComplete) { + void BlockingUDPTransport::close(bool waitForThreadToComplete) { { Lock guard(_mutex); if(_closed.get()) return; @@ -226,14 +226,14 @@ namespace epics { LOG(logLevelError, "Socket recvfrom error: %s", errStr); } - close(true, false); + close(false); break; } } } catch(...) { // TODO: catch all exceptions, and act accordingly - close(true, false); + close(false); } String threadName = "UDP-receive "+inetAddressToString(_bindAddress); @@ -333,7 +333,7 @@ namespace epics { return allOK; } - int BlockingUDPTransport::getSocketReceiveBufferSize() const { + size_t BlockingUDPTransport::getSocketReceiveBufferSize() const { // Get value of the SO_RCVBUF option for this DatagramSocket, // that is the buffer size used by the platform for input on // this DatagramSocket. @@ -349,7 +349,7 @@ namespace epics { LOG(logLevelError, "Socket getsockopt SO_RCVBUF error: %s", errStr); } - return sockBufSize; + return (size_t)sockBufSize; } void BlockingUDPTransport::threadRunner(void* param) { diff --git a/pvAccessApp/remote/remote.h b/pvAccessApp/remote/remote.h index 4dd0d7d..acef8d2 100644 --- a/pvAccessApp/remote/remote.h +++ b/pvAccessApp/remote/remote.h @@ -109,8 +109,7 @@ namespace epics { */ class TransportSendControl : public epics::pvData::SerializableControl { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(TransportSendControl); virtual ~TransportSendControl() {} @@ -119,7 +118,7 @@ namespace epics { virtual void flush(bool lastMessageCompleted) = 0; - virtual void setRecipient(const osiSockAddr& sendTo) = 0; + virtual void setRecipient(osiSockAddr const & sendTo) = 0; }; /** @@ -127,8 +126,7 @@ namespace epics { */ class TransportSender : public Lockable { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(TransportSender); virtual ~TransportSender() {} @@ -138,54 +136,68 @@ namespace epics { * Calls on TransportSendControl instance must be made from * calling thread. Moreover, ownership is valid only for the time of call * of this method. - * NOTE: these limitations allows efficient implementation. + * NOTE: these limitations allow efficient implementation. */ virtual void send(epics::pvData::ByteBuffer* buffer, TransportSendControl* control) = 0; }; + class TransportClient; + /** * Interface defining transport (connection). */ class Transport : public epics::pvData::DeserializableControl { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; - typedef std::tr1::weak_ptr weak_pointer; - typedef std::tr1::weak_ptr const_weak_pointer; + POINTER_DEFINITIONS(Transport); virtual ~Transport() {} + /** + * Acquires transport. + * @param client client (channel) acquiring the transport + * @return true if transport was granted, false otherwise. + */ + //virtual bool acquire(TransportClient::shared_pointer const & client) = 0; + virtual bool acquire(std::tr1::shared_ptr const & client) = 0; + + /** + * Releases transport. + * @param client client (channel) releasing the transport + */ + virtual void release(pvAccessID clientId) = 0; + //virtual void release(TransportClient::shared_pointer const & client) = 0; + + /** + * Get protocol type (tcp, udp, ssl, etc.). + * @return protocol type. + */ + virtual epics::pvData::String getType() const = 0; + /** * Get remote address. * @return remote address, can be null. */ virtual const osiSockAddr* getRemoteAddress() const = 0; - /** - * Get protocol type (tcp, udp, ssl, etc.). - * @return protocol type. - */ - virtual const epics::pvData::String getType() const = 0; + // TODO getContext? /** * Transport protocol minor revision. * @return protocol minor revision. */ - virtual epics::pvData::int8 getRevision() const { - return CA_PROTOCOL_REVISION; - } + virtual epics::pvData::int8 getRevision() const = 0; /** * Get receive buffer size. * @return receive buffer size. */ - virtual int getReceiveBufferSize() const = 0; + virtual std::size_t getReceiveBufferSize() const = 0; /** * Get socket receive buffer size. * @return socket receive buffer size. */ - virtual int getSocketReceiveBufferSize() const = 0; + virtual std::size_t getSocketReceiveBufferSize() const = 0; /** * Transport priority. @@ -194,27 +206,29 @@ namespace epics { virtual epics::pvData::int16 getPriority() const = 0; /** - * Set remote transport protocol minor revision. - * @param minor protocol minor revision. + * Set remote transport protocol revision. + * @param revision protocol revision. */ - virtual void setRemoteMinorRevision(epics::pvData::int8 minor) = 0; + virtual void setRemoteRevision(epics::pvData::int8 revision) = 0; /** * Set remote transport receive buffer size. * @param receiveBufferSize receive buffer size. */ - virtual void setRemoteTransportReceiveBufferSize(int receiveBufferSize) = 0; + virtual void setRemoteTransportReceiveBufferSize(std::size_t receiveBufferSize) = 0; /** * Set remote transport socket receive buffer size. * @param socketReceiveBufferSize remote socket receive buffer size. */ - virtual void setRemoteTransportSocketReceiveBufferSize(int socketReceiveBufferSize) = 0; + virtual void setRemoteTransportSocketReceiveBufferSize(std::size_t socketReceiveBufferSize) = 0; - /** - * Notification transport that is still alive. - */ - virtual void aliveNotification() = 0; + /** + * Set byte order. + * @param byteOrder byte order to set. + */ + // TODO enum + virtual void setByteOrder(int byteOrder) = 0; /** * Notification that transport has changed. @@ -222,38 +236,37 @@ namespace epics { virtual void changedTransport() = 0; /** - * Close transport. - * @param force flag indicating force-full (e.g. remote disconnect) close. + * Enqueue send request. + * @param sender */ - virtual void close(bool force) = 0; - - /** - * Check connection status. - * @return true if connected. - */ - virtual bool isClosed() = 0; - - /** - * Get transport verification status. - * @return verification flag. - */ - virtual bool isVerified() = 0; + virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0; /** * Notify transport that it is has been verified. */ virtual void verified() = 0; + /** + * Waits (if needed) until transport is verified, i.e. verified() method is being called. + * @param timeoutMs timeout to wait for verification, infinite if 0. + */ + virtual bool verify(epics::pvData::int32 timeoutMs) = 0; + /** - * Enqueue send request. - * @param sender + * Notification transport that is still alive. */ - virtual void enqueueSendRequest(TransportSender::shared_pointer const & sender) = 0; + virtual void aliveNotification() = 0; - virtual void enqueueOnlySendRequest(TransportSender::shared_pointer const & sender) {}; - - virtual void flushSendQueue() {}; + /** + * Close transport. + */ + virtual void close() = 0; + /** + * Check connection status. + * @return true if connected. + */ + virtual bool isClosed() = 0; }; class Channel; @@ -263,27 +276,30 @@ namespace epics { */ class Context { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; - typedef std::tr1::weak_ptr weak_pointer; - typedef std::tr1::weak_ptr const_weak_pointer; + POINTER_DEFINITIONS(Context); virtual ~Context() {} - virtual std::tr1::shared_ptr getChannel(pvAccessID id) = 0; - - virtual Transport::shared_pointer getSearchTransport() = 0; - - virtual epics::pvData::Timer::shared_pointer getTimer() = 0; //virtual TransportRegistry::shared_pointer getTransportRegistry() = 0; virtual std::tr1::shared_ptr getTransportRegistry() = 0; + + + virtual Configuration::shared_pointer getConfiguration() = 0; - - virtual void beaconAnomalyNotify() = 0; - + + + + /// + /// due to ClientContextImpl + /// + + virtual void newServerDetected() = 0; + + virtual std::tr1::shared_ptr getChannel(pvAccessID id) = 0; + virtual Transport::shared_pointer getSearchTransport() = 0; }; /** @@ -291,8 +307,7 @@ namespace epics { */ class ResponseHandler { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(ResponseHandler); virtual ~ResponseHandler() {} @@ -348,10 +363,7 @@ namespace epics { */ class TransportClient { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; - typedef std::tr1::weak_ptr weak_pointer; - typedef std::tr1::weak_ptr const_weak_pointer; + POINTER_DEFINITIONS(TransportClient); virtual ~TransportClient() { } @@ -405,35 +417,9 @@ namespace epics { }; - /** - * Interface defining reference counting transport IF. - */ - class ReferenceCountingTransport { - public: - virtual ~ReferenceCountingTransport() { - } - - /** - * Acquires transport. - * @param client client (channel) acquiring the transport - * @return true if transport was granted, false otherwise. - */ - virtual bool acquire(TransportClient::shared_pointer const & client) = 0; - - /** - * Releases transport. - * @param client client (channel) releasing the transport - */ - virtual void release(pvAccessID clientId) = 0; - //virtual void release(TransportClient::shared_pointer const & client) = 0; - }; - class ServerChannel { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; - typedef std::tr1::weak_ptr weak_pointer; - typedef std::tr1::weak_ptr const_weak_pointer; + POINTER_DEFINITIONS(ServerChannel); virtual ~ServerChannel() {} /** @@ -454,8 +440,7 @@ namespace epics { */ class ChannelHostingTransport { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(ChannelHostingTransport); virtual ~ChannelHostingTransport() {} @@ -510,10 +495,7 @@ namespace epics { */ class ResponseRequest { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; - typedef std::tr1::weak_ptr weak_pointer; - typedef std::tr1::weak_ptr const_weak_pointer; + POINTER_DEFINITIONS(ResponseRequest); virtual ~ResponseRequest() {} @@ -537,7 +519,7 @@ namespace epics { * Report status to clients (e.g. disconnected). * @param status to report. */ - virtual void reportStatus(const epics::pvData::Status& status) = 0; + virtual void reportStatus(epics::pvData::Status const & status) = 0; /** * Get request requester. @@ -547,13 +529,10 @@ namespace epics { }; /** - * @author Matej Sekoranja - * @version $Id: DataResponse.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ */ class DataResponse : public ResponseRequest { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(DataResponse); virtual ~DataResponse() {} @@ -571,13 +550,10 @@ namespace epics { * A request that expects an response multiple responses. * Responses identified by its I/O ID. * This interface needs to be extended (to provide method called on response). - * @author Matej Sekoranja - * @version $Id: SubscriptionRequest.java,v 1.1 2010/05/03 14:45:39 mrkraimer Exp $ */ class SubscriptionRequest /*: public ResponseRequest*/ { public: - typedef std::tr1::shared_ptr shared_pointer; - typedef std::tr1::shared_ptr const_shared_pointer; + POINTER_DEFINITIONS(SubscriptionRequest); virtual ~SubscriptionRequest() {} diff --git a/pvAccessApp/remoteClient/clientContextImpl.cpp b/pvAccessApp/remoteClient/clientContextImpl.cpp index 3a1c839..4890c63 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.cpp +++ b/pvAccessApp/remoteClient/clientContextImpl.cpp @@ -2578,7 +2578,7 @@ namespace epics { transport->setRemoteTransportReceiveBufferSize(payloadBuffer->getInt()); transport->setRemoteTransportSocketReceiveBufferSize(payloadBuffer->getInt()); - transport->setRemoteMinorRevision(version); + transport->setRemoteRevision(version); TransportSender::shared_pointer sender = dynamic_pointer_cast(transport); if (sender.get()) { transport->enqueueSendRequest(sender); @@ -3167,12 +3167,7 @@ namespace epics { { disconnectPendingIO(false); - ReferenceCountingTransport* rct = dynamic_cast(m_transport.get()); - if (rct) - { - //TransportClient::shared_pointer thisPointer = shared_from_this(); - rct->release(getID()); - } + m_transport->release(getID()); } else if (m_transport == transport) { @@ -3295,11 +3290,7 @@ namespace epics { else if (m_transport) { // unresponsive state, do not forget to release transport - ReferenceCountingTransport* rct = dynamic_cast(m_transport.get()); - if (rct) { - //TransportClient::shared_pointer thisPointer = shared_from_this(); - rct->release(getID()); - } + m_transport->release(getID()); m_transport.reset(); } @@ -3345,11 +3336,7 @@ namespace epics { m_transport->enqueueSendRequest(thisSender); } - ReferenceCountingTransport* rct = dynamic_cast(m_transport.get()); - if (rct) { - //TransportClient::shared_pointer thisPointer = shared_from_this(); - rct->release(getID()); - } + m_transport->release(getID()); m_transport.reset(); } @@ -3979,8 +3966,8 @@ TODO destroyAllChannels(); // stop UDPs - m_searchTransport->close(true); - m_broadcastTransport->close(true); + m_searchTransport->close(); + m_broadcastTransport->close(); } void destroyAllChannels() { @@ -4154,7 +4141,7 @@ TODO /** * Called each time beacon anomaly is detected. */ - void beaconAnomalyNotify() + virtual void newServerDetected() { if (m_channelSearchManager) m_channelSearchManager->beaconAnomalyNotify(); diff --git a/pvAccessApp/remoteClient/clientContextImpl.h b/pvAccessApp/remoteClient/clientContextImpl.h index a677de5..0f246d2 100644 --- a/pvAccessApp/remoteClient/clientContextImpl.h +++ b/pvAccessApp/remoteClient/clientContextImpl.h @@ -87,7 +87,7 @@ namespace epics { virtual void dispose() = 0; - virtual ChannelSearchManager::shared_pointer getChannelSearchManager() = 0; + virtual ChannelSearchManager::shared_pointer getChannelSearchManager() = 0; virtual void checkChannelName(epics::pvData::String& name) = 0; virtual void registerChannel(ChannelImpl::shared_pointer const & channel) = 0; @@ -103,12 +103,12 @@ namespace epics { virtual Transport::shared_pointer getTransport(TransportClient::shared_pointer const & client, osiSockAddr* serverAddress, epics::pvData::int8 minorRevision, epics::pvData::int16 priority) = 0; - virtual void beaconAnomalyNotify() = 0; + virtual void newServerDetected() = 0; virtual std::tr1::shared_ptr getBeaconHandler(osiSockAddr* responseFrom) = 0; }; - + extern ClientContextImpl::shared_pointer createClientContextImpl(); } diff --git a/pvAccessApp/server/responseHandlers.cpp b/pvAccessApp/server/responseHandlers.cpp index 711deac..1e9c588 100644 --- a/pvAccessApp/server/responseHandlers.cpp +++ b/pvAccessApp/server/responseHandlers.cpp @@ -110,7 +110,7 @@ void ServerConnectionValidationHandler::handleResponse( payloadBuffer->getInt()); transport->setRemoteTransportSocketReceiveBufferSize( payloadBuffer->getInt()); - transport->setRemoteMinorRevision(version); + transport->setRemoteRevision(version); // TODO support priority !!! //transport.setPriority(payloadBuffer.getShort()); } @@ -319,7 +319,7 @@ void ServerCreateChannelHandler::handleResponse(osiSockAddr* responseFrom, void ServerCreateChannelHandler::disconnect(Transport::shared_pointer const & transport) { - transport->close(true); + transport->close(); } ServerChannelRequesterImpl::ServerChannelRequesterImpl(Transport::shared_pointer const & transport, diff --git a/pvAccessApp/server/serverContext.cpp b/pvAccessApp/server/serverContext.cpp index cff244d..4294773 100644 --- a/pvAccessApp/server/serverContext.cpp +++ b/pvAccessApp/server/serverContext.cpp @@ -336,7 +336,7 @@ void ServerContextImpl::internalDestroy() // stop responding to search requests if (_broadcastTransport != NULL) { - _broadcastTransport->close(true); + _broadcastTransport->close(); _broadcastTransport.reset(); } @@ -382,7 +382,7 @@ void ServerContextImpl::destroyAllTransports() Transport::shared_pointer transport = (*transports)[i]; try { - transport->close(true); + transport->close(); } catch (std::exception &e) { @@ -553,7 +553,7 @@ Transport::shared_pointer ServerContextImpl::getSearchTransport() return Transport::shared_pointer(); } -void ServerContextImpl::beaconAnomalyNotify() +void ServerContextImpl::newServerDetected() { // not used } diff --git a/pvAccessApp/server/serverContext.h b/pvAccessApp/server/serverContext.h index 3f74016..6f79b63 100644 --- a/pvAccessApp/server/serverContext.h +++ b/pvAccessApp/server/serverContext.h @@ -130,7 +130,7 @@ public: TransportRegistry::shared_pointer getTransportRegistry(); std::auto_ptr createResponseHandler(); - void beaconAnomalyNotify(); + virtual void newServerDetected(); /** * Version. diff --git a/testApp/remote/testBlockingTCPClnt.cpp b/testApp/remote/testBlockingTCPClnt.cpp index 0e0e1ad..11d2038 100644 --- a/testApp/remote/testBlockingTCPClnt.cpp +++ b/testApp/remote/testBlockingTCPClnt.cpp @@ -58,7 +58,7 @@ public: } virtual void acquire() {} virtual void release() {} - virtual void beaconAnomalyNotify() {} + virtual void newServerDetected() {} private: std::tr1::shared_ptr _tr; diff --git a/testApp/remote/testBlockingUDPClnt.cpp b/testApp/remote/testBlockingUDPClnt.cpp index 2c5e485..3ee83d4 100644 --- a/testApp/remote/testBlockingUDPClnt.cpp +++ b/testApp/remote/testBlockingUDPClnt.cpp @@ -50,7 +50,7 @@ public: } virtual void acquire() {} virtual void release() {} - virtual void beaconAnomalyNotify() {} + virtual void newServerDetected() {} }; class DummyResponseHandler : public ResponseHandler { diff --git a/testApp/remote/testBlockingUDPSrv.cpp b/testApp/remote/testBlockingUDPSrv.cpp index 08f23e9..291c0c9 100644 --- a/testApp/remote/testBlockingUDPSrv.cpp +++ b/testApp/remote/testBlockingUDPSrv.cpp @@ -44,7 +44,7 @@ public: } virtual void acquire() {} virtual void release() {} - virtual void beaconAnomalyNotify() {} + virtual void newServerDetected() {} }; class DummyResponseHandler : public ResponseHandler {