in src/connection.c [1756:1832]
uint64_t connection_handle_deadlines(CONNECTION_HANDLE connection)
{
uint64_t local_deadline = (uint64_t)-1;
uint64_t remote_deadline = (uint64_t)-1;
if (connection == NULL)
{
LogError("NULL connection");
}
else
{
tickcounter_ms_t current_ms;
if (tickcounter_get_current_ms(connection->tick_counter, ¤t_ms) != 0)
{
LogError("Could not get tick counter value");
close_connection_with_error(connection, "amqp:internal-error", "Could not get tick count", NULL);
}
else
{
if (connection->idle_timeout_specified && (connection->idle_timeout != 0))
{
/* Calculate time until configured idle timeout expires */
uint64_t time_since_last_received = current_ms - connection->last_frame_received_time;
if (time_since_last_received < connection->idle_timeout)
{
local_deadline = connection->idle_timeout - time_since_last_received;
}
else
{
local_deadline = 0;
/* close connection */
close_connection_with_error(connection, "amqp:internal-error", "No frame received for the idle timeout", NULL);
}
}
if (local_deadline != 0 && connection->remote_idle_timeout != 0)
{
/* Calculate time until remote idle timeout expires */
uint64_t remote_idle_timeout = connection->remote_idle_timeout_send_frame_millisecond;
uint64_t time_since_last_sent = current_ms - connection->last_frame_sent_time;
if (time_since_last_sent < remote_idle_timeout)
{
remote_deadline = remote_idle_timeout - time_since_last_sent;
}
else
{
connection->on_send_complete = NULL;
if (amqp_frame_codec_encode_empty_frame(connection->amqp_frame_codec, 0, on_bytes_encoded, connection) != 0)
{
LogError("Encoding the empty frame failed");
/* close connection */
close_connection_with_error(connection, "amqp:internal-error", "Cannot send empty frame", NULL);
}
else
{
if (connection->is_trace_on == 1)
{
LOG(AZ_LOG_TRACE, LOG_LINE, "-> Empty frame");
}
connection->last_frame_sent_time = current_ms;
remote_deadline = remote_idle_timeout;
}
}
}
}
}
/* Return the shorter of each deadline, or 0 to indicate connection closed */
return local_deadline > remote_deadline ? remote_deadline : local_deadline;
}