Enable client sending of CMD_ECHO
This commit is contained in:
@@ -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<TimerCallback>(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<TransportSender>(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<TransportSender>(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
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user