in proton-j/src/main/java/org/apache/qpid/proton/engine/impl/TransportImpl.java [1649:1711]
public long tick(long now)
{
long deadline = 0;
if (_localIdleTimeout > 0) {
if (_localIdleDeadline == 0 || _lastBytesInput != _bytesInput) {
_localIdleDeadline = computeDeadline(now, _localIdleTimeout);
_lastBytesInput = _bytesInput;
} else if (_localIdleDeadline - now <= 0) {
_localIdleDeadline = computeDeadline(now, _localIdleTimeout);
if (_connectionEndpoint != null &&
_connectionEndpoint.getLocalState() != EndpointState.CLOSED) {
ErrorCondition condition =
new ErrorCondition(Symbol.getSymbol("amqp:resource-limit-exceeded"),
"local-idle-timeout expired");
_connectionEndpoint.setCondition(condition);
_connectionEndpoint.setLocalState(EndpointState.CLOSED);
if (!_isOpenSent) {
if ((_sasl != null) && (!_sasl.isDone())) {
_sasl.fail();
}
Open open = new Open();
_isOpenSent = true;
writeFrame(0, open, null, null);
}
if (!_isCloseSent) {
Close close = new Close();
close.setError(condition);
_isCloseSent = true;
writeFrame(0, close, null, null);
}
close_tail();
}
}
deadline = _localIdleDeadline;
}
if (_remoteIdleTimeout != 0 && !_isCloseSent) {
if (_remoteIdleDeadline == 0 || _lastBytesOutput != _bytesOutput) {
_remoteIdleDeadline = computeDeadline(now, _remoteIdleTimeout / 2);
_lastBytesOutput = _bytesOutput;
} else if (_remoteIdleDeadline - now <= 0) {
_remoteIdleDeadline = computeDeadline(now, _remoteIdleTimeout / 2);
if (pending() == 0) {
writeFrame(0, null, null, null);
_lastBytesOutput += pending();
}
}
if(deadline == 0) {
deadline = _remoteIdleDeadline;
} else {
if(_remoteIdleDeadline - _localIdleDeadline <= 0) {
deadline = _remoteIdleDeadline;
} else {
deadline = _localIdleDeadline;
}
}
}
return deadline;
}