From 2da60b083e820f046cf89e392bb52cdb8dd07184 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 20 May 2019 21:00:43 -0700 Subject: [PATCH] Enable client sending of CMD_ECHO --- src/remote/codec.cpp | 54 ++++++++++++++++++++++--------------------- src/remote/pv/codec.h | 14 +++++------ 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/remote/codec.cpp b/src/remote/codec.cpp index bf72803..b8cc1f8 100644 --- a/src/remote/codec.cpp +++ b/src/remote/codec.cpp @@ -1696,24 +1696,26 @@ BlockingClientTCPTransportCodec::BlockingClientTCPTransportCodec( int16_t priority ) : BlockingTCPTransportCodec(false, context, channel, responseHandler, sendBufferSize, receiveBufferSize, priority), - _connectionTimeout(heartbeatInterval*1000), + _connectionTimeout(heartbeatInterval), _unresponsiveTransport(false), - _verifyOrEcho(true) + _verifyOrEcho(true), + sendQueued(true) // don't start sending echo until after auth complete { // initialize owners list, send queue acquire(client); // use immediate for clients //setFlushStrategy(DELAYED); - - // setup connection timeout timer (watchdog) - moved to start() method - epicsTimeGetCurrent(&_aliveTimestamp); } void BlockingClientTCPTransportCodec::start() { TimerCallbackPtr tcb = std::tr1::dynamic_pointer_cast(shared_from_this()); - _context->getTimer()->schedulePeriodic(tcb, _connectionTimeout, _connectionTimeout); + // add some randomness to our timer phase + double R = float(rand())/RAND_MAX; // [0, 1] + // shape a bit + R = R*0.5 + 0.5; // [0.5, 1.0] + _context->getTimer()->schedulePeriodic(tcb, _connectionTimeout/2.0*R, _connectionTimeout/2.0); BlockingTCPTransportCodec::start(); } @@ -1728,24 +1730,16 @@ BlockingClientTCPTransportCodec::~BlockingClientTCPTransportCodec() { -void BlockingClientTCPTransportCodec::callback() { - epicsTimeStamp currentTime; - epicsTimeGetCurrent(¤tTime); - - _mutex.lock(); - // no exception expected here - double diff = epicsTimeDiffInSeconds(¤tTime, &_aliveTimestamp); - _mutex.unlock(); - - if(diff>((3*_connectionTimeout)/2)) { - unresponsiveTransport(); - } - // use some k (3/4) to handle "jitter" - else if(diff>=((3*_connectionTimeout)/4)) { - // send echo - TransportSender::shared_pointer transportSender = std::tr1::dynamic_pointer_cast(shared_from_this()); - enqueueSendRequest(transportSender); +void BlockingClientTCPTransportCodec::callback() +{ + { + Guard G(_mutex); + if(sendQueued) return; + sendQueued = true; } + // send echo + TransportSender::shared_pointer transportSender = std::tr1::dynamic_pointer_cast(shared_from_this()); + enqueueSendRequest(transportSender); } #define EXCEPTION_GUARD(code) try { code; } \ @@ -1842,8 +1836,9 @@ void BlockingClientTCPTransportCodec::release(pvAccessID clientID) { } void BlockingClientTCPTransportCodec::aliveNotification() { + // TODO: dead code Lock guard(_mutex); - epicsTimeGetCurrent(&_aliveTimestamp); + //epicsTimeGetCurrent(&_aliveTimestamp); if(_unresponsiveTransport) responsiveTransport(); } @@ -1879,10 +1874,17 @@ void BlockingClientTCPTransportCodec::changedTransport() { } void BlockingClientTCPTransportCodec::send(ByteBuffer* buffer, - TransportSendControl* control) { - if(_verifyOrEcho) { + TransportSendControl* control) +{ + bool voe; + { + Guard G(_mutex); + sendQueued = false; + voe = _verifyOrEcho; _verifyOrEcho = false; + } + if(voe) { /* * send verification response message */ diff --git a/src/remote/pv/codec.h b/src/remote/pv/codec.h index 4807337..245f227 100644 --- a/src/remote/pv/codec.h +++ b/src/remote/pv/codec.h @@ -335,7 +335,7 @@ public: virtual void waitJoin() OVERRIDE FINAL; virtual bool terminated() OVERRIDE FINAL; virtual bool isOpen() OVERRIDE FINAL; - void start(); + virtual void start(); virtual int read(epics::pvData::ByteBuffer* dst) OVERRIDE FINAL; virtual int write(epics::pvData::ByteBuffer* src) OVERRIDE FINAL; @@ -646,7 +646,7 @@ public: public: - void start(); + virtual void start() OVERRIDE FINAL; virtual ~BlockingClientTCPTransportCodec() OVERRIDE FINAL; @@ -689,20 +689,18 @@ private: /** * Connection timeout (no-traffic) flag. */ - double _connectionTimeout; + const double _connectionTimeout; /** * Unresponsive transport flag. */ bool _unresponsiveTransport; - /** - * Timestamp of last "live" event on this transport. - */ - epicsTimeStamp _aliveTimestamp; - bool _verifyOrEcho; + // are we queued to send verify or echo? + bool sendQueued; + /** * Unresponsive transport notify. */