in src/link.c [1603:1651]
void link_dowork(LINK_HANDLE link)
{
if (link == NULL)
{
LogError("NULL link");
}
else
{
tickcounter_ms_t current_tick;
if (tickcounter_get_current_ms(link->tick_counter, ¤t_tick) != 0)
{
LogError("Cannot get tick counter value");
}
else
{
// go through all and find timed out deliveries
LIST_ITEM_HANDLE item = singlylinkedlist_get_head_item(link->pending_deliveries);
while (item != NULL)
{
LIST_ITEM_HANDLE next_item = singlylinkedlist_get_next_item(item);
ASYNC_OPERATION_HANDLE delivery_instance_async_operation = (ASYNC_OPERATION_HANDLE)singlylinkedlist_item_get_value(item);
if (delivery_instance_async_operation != NULL)
{
DELIVERY_INSTANCE* delivery_instance = (DELIVERY_INSTANCE*)GET_ASYNC_OPERATION_CONTEXT(DELIVERY_INSTANCE, delivery_instance_async_operation);
if ((delivery_instance != NULL) &&
(delivery_instance->timeout != 0) &&
(current_tick - delivery_instance->start_tick >= delivery_instance->timeout))
{
if (delivery_instance->on_delivery_settled != NULL)
{
delivery_instance->on_delivery_settled(delivery_instance->callback_context, delivery_instance->delivery_id, LINK_DELIVERY_SETTLE_REASON_TIMEOUT, NULL);
}
if (singlylinkedlist_remove(link->pending_deliveries, item) != 0)
{
LogError("Cannot remove item from list");
}
async_operation_destroy(delivery_instance_async_operation);
}
}
item = next_item;
}
}
}
}