/** * Free all request items * @param tail Pointer to request queue tail pointer */ static void mqtt_clear_requests(struct mqtt_request_t **tail) { struct mqtt_request_t *iter, *next; LWIP_ASSERT("mqtt_clear_requests: tail != NULL", tail != NULL); for (iter = *tail; iter != NULL; iter = next) { next = iter->next; mqtt_delete_request(iter); } *tail = NULL; }
/** * Handle requests timeout * @param tail Pointer to request queue tail pointer * @param t Time since last call in seconds */ static void mqtt_request_time_elapsed(struct mqtt_request_t **tail, u8_t t) { struct mqtt_request_t *r = *tail; LWIP_ASSERT("mqtt_request_time_elapsed: tail != NULL", tail != NULL); while (t > 0 && r != NULL) { if (t >= r->timeout_diff) { t -= (u8_t)r->timeout_diff; /* Unchain */ *tail = r->next; /* Notify upper layer about timeout */ if (r->cb != NULL) { r->cb(r->arg, ERR_TIMEOUT); } mqtt_delete_request(r); /* Tail might be be modified in callback, so re-read it in every iteration */ r = *(struct mqtt_request_t * const volatile *)tail; } else { r->timeout_diff -= t; t = 0; } } }