close wsi must do detatch ah flow even if no ah

Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
Andy Green 2016-02-25 21:50:49 +08:00
parent 897197146a
commit 4ba798dd7d
3 changed files with 18 additions and 15 deletions

View file

@ -27,6 +27,9 @@ when it finishes replying to a transaction in http. Previously the library
did it for you, but that disallowed large, long transfers with multiple
trips around the event loop (and cgi...).
6) MAJOR connections on ah waiting list that closed did not get removed from
the waiting list...
Changes
-------

View file

@ -58,11 +58,12 @@ lws_free_wsi(struct lws *wsi)
lws_free_set_NULL(wsi->rxflow_buffer);
lws_free_set_NULL(wsi->trunc_alloc);
if (wsi->u.hdr.ah) {
if (wsi->u.hdr.ah)
/* we're closing, losing some rx is OK */
wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen;
lws_header_table_detach(wsi);
}
/* we may not have an ah, but may be on the waiting list... */
lws_header_table_detach(wsi);
wsi->context->count_wsi_allocated--;
lwsl_debug("%s: %p, remaining wsi %d\n", __func__, wsi,

View file

@ -203,19 +203,18 @@ int lws_header_table_detach(struct lws *wsi)
pwsi = &pt->ah_wait_list;
if (!ah) { /* remove from wait list if none attached */
// if (wsi->socket_is_permanently_unusable)
while (*pwsi) {
if (*pwsi == wsi) {
lwsl_info("%s: wsi %p, remv wait\n",
__func__, wsi);
*pwsi = wsi->u.hdr.ah_wait_list;
wsi->u.hdr.ah_wait_list = NULL;
pt->ah_wait_list_length--;
goto bail;
}
pwsi = &(*pwsi)->u.hdr.ah_wait_list;
while (*pwsi) {
if (*pwsi == wsi) {
lwsl_info("%s: wsi %p, remv wait\n",
__func__, wsi);
*pwsi = wsi->u.hdr.ah_wait_list;
wsi->u.hdr.ah_wait_list = NULL;
pt->ah_wait_list_length--;
goto bail;
}
pwsi = &(*pwsi)->u.hdr.ah_wait_list;
}
/* no ah, not on list... no more business here */
goto bail;
}
/* we did have an ah attached */