{
struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi];
- if (!wsi->timeout_list_prev)
+ if (!wsi->timeout_list_prev) /* ie, not part of the list */
return;
lws_pt_lock(pt);
+ /* if we have a next guy, set his prev to our prev */
if (wsi->timeout_list)
wsi->timeout_list->timeout_list_prev = wsi->timeout_list_prev;
+ /* set our prev guy to our next guy instead of us */
*wsi->timeout_list_prev = wsi->timeout_list;
+ /* we're out of the list, we should not point anywhere any more */
wsi->timeout_list_prev = NULL;
wsi->timeout_list = NULL;
lws_pt_unlock(pt);
time(&now);
- if (!wsi->pending_timeout && reason) {
+ if (reason && !wsi->timeout_list_prev) {
+ /* our next guy is current first guy */
wsi->timeout_list = pt->timeout_list;
+ /* if there is a next guy, set his prev ptr to our next ptr */
if (wsi->timeout_list)
wsi->timeout_list->timeout_list_prev = &wsi->timeout_list;
+ /* our prev ptr is first ptr */
wsi->timeout_list_prev = &pt->timeout_list;
+ /* set the first guy to be us */
*wsi->timeout_list_prev = wsi;
}
/* if we are already bound to one, just clear it down */
if (wsi->u.hdr.ah) {
- lwsl_err("cleardown\n");
+ lwsl_info("cleardown\n");
goto reset;
}
goto bail;
}
/* new ah.... remove ourselves from waiting list */
- *pwsi = wsi->u.hdr.ah_wait_list;
- wsi->u.hdr.ah_wait_list = NULL;
+ *pwsi = wsi->u.hdr.ah_wait_list; /* set our prev to our next */
+ wsi->u.hdr.ah_wait_list = NULL; /* no next any more */
pt->ah_wait_list_length--;
break;
}
lws_pt_lock(pt);
pwsi = &pt->ah_wait_list;
- if (!ah) { /* remove from wait list if that's all */
+ if (!ah) { /* remove from wait list if none attached */
// if (wsi->socket_is_permanently_unusable)
while (*pwsi) {
if (*pwsi == wsi) {
goto bail;
}
+ /* we did have an ah attached */
time(&now);
if (now - wsi->u.hdr.ah->assigned > 3) {
/*
wsi->u.hdr.ah = NULL;
ah->wsi = NULL; /* no owner */
+ /* oh there is nobody on the waiting list... leave it at that then */
if (!*pwsi) {
ah->in_use = 0;
pt->ah_count_in_use--;
goto bail;
}
- /* somebody else on same tsi is waiting, give it to him */
+ /* somebody else on same tsi is waiting, give it to oldest guy */
lwsl_info("pt wait list %p\n", *pwsi);
while ((*pwsi)->u.hdr.ah_wait_list)
/* point prev guy to next guy in list instead */
*pwsi = wsi->u.hdr.ah_wait_list;
+ /* the guy who got one is out of the list */
wsi->u.hdr.ah_wait_list = NULL;
pt->ah_wait_list_length--;