void link_dowork()

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, &current_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;
            }
        }
    }
}