From 12369b0c9132b46623acf740e6686a720a47ed61 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 25 Feb 2016 21:54:31 +0800 Subject: [PATCH] improve timeout and ah list comments Signed-off-by: Andy Green --- lib/libwebsockets.c | 11 +++++++++-- lib/parsers.c | 13 ++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index b4bac9f..a564520 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -71,14 +71,17 @@ lws_remove_from_timeout_list(struct lws *wsi) { 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); @@ -104,11 +107,15 @@ lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs) 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; } diff --git a/lib/parsers.c b/lib/parsers.c index 2547ec9..af4c129 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -97,7 +97,7 @@ lws_header_table_attach(struct lws *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; } @@ -112,8 +112,8 @@ lws_header_table_attach(struct lws *wsi) 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; } @@ -189,7 +189,7 @@ int lws_header_table_detach(struct lws *wsi) 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) { @@ -205,6 +205,7 @@ int lws_header_table_detach(struct lws *wsi) goto bail; } + /* we did have an ah attached */ time(&now); if (now - wsi->u.hdr.ah->assigned > 3) { /* @@ -226,6 +227,7 @@ int lws_header_table_detach(struct lws *wsi) 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--; @@ -233,7 +235,7 @@ int lws_header_table_detach(struct lws *wsi) 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) @@ -258,6 +260,7 @@ int lws_header_table_detach(struct lws *wsi) /* 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--; -- 2.7.4