diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index d93e6051..6a6cf0bd 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -556,25 +556,27 @@ __lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char * * if we have wsi in our transaction queue, if we are closing we * must go through and close all those first */ - lws_vhost_lock(wsi->vhost); - lws_start_foreach_dll_safe(struct lws_dll_lws *, d, d1, - wsi->dll_client_transaction_queue_head.next) { - struct lws *w = lws_container_of(d, struct lws, - dll_client_transaction_queue); + if (wsi->vhost) { + lws_vhost_lock(wsi->vhost); + lws_start_foreach_dll_safe(struct lws_dll_lws *, d, d1, + wsi->dll_client_transaction_queue_head.next) { + struct lws *w = lws_container_of(d, struct lws, + dll_client_transaction_queue); - __lws_close_free_wsi(w, reason, "trans q leader closing"); - } lws_end_foreach_dll_safe(d, d1); + __lws_close_free_wsi(w, reason, "trans q leader closing"); + } lws_end_foreach_dll_safe(d, d1); - /* - * !!! If we are closing, but we have pending pipelined transaction - * results we already sent headers for, that's going to destroy sync - * for HTTP/1 and leave H2 stream with no live swsi. - * - * However this is normal if we are being closed because the transaction - * queue leader is closing. - */ - lws_dll_lws_remove(&wsi->dll_client_transaction_queue); - lws_vhost_unlock(wsi->vhost); + /* + * !!! If we are closing, but we have pending pipelined transaction + * results we already sent headers for, that's going to destroy sync + * for HTTP/1 and leave H2 stream with no live swsi. + * + * However this is normal if we are being closed because the transaction + * queue leader is closing. + */ + lws_dll_lws_remove(&wsi->dll_client_transaction_queue); + lws_vhost_unlock(wsi->vhost); + } #endif /* if we have children, close them first */ diff --git a/lib/pollfd.c b/lib/pollfd.c index 18474b7e..901167b7 100644 --- a/lib/pollfd.c +++ b/lib/pollfd.c @@ -328,24 +328,27 @@ __remove_wsi_socket_from_fds(struct lws *wsi) __func__, wsi, wsi->desc.sockfd, wsi->position_in_fds_table, pt->fds_count, pt->fds[pt->fds_count].fd); - /* have the last guy take up the now vacant slot */ - pt->fds[m] = pt->fds[pt->fds_count - 1]; - /* this decrements pt->fds_count */ - lws_plat_delete_socket_from_fds(context, wsi, m); - v = (int) pt->fds[m].fd; - /* end guy's "position in fds table" is now the deletion guy's old one */ - end_wsi = wsi_from_fd(context, v); - if (!end_wsi) { - lwsl_err("no wsi found for fd %d at pos %d, pt->fds_count=%d\n", - (int)pt->fds[m].fd, m, pt->fds_count); - assert(0); - } else - end_wsi->position_in_fds_table = m; + if (m != LWS_SOCK_INVALID) { - /* deletion guy's lws_lookup entry needs nuking */ - delete_from_fd(context, wsi->desc.sockfd); - /* removed wsi has no position any more */ - wsi->position_in_fds_table = -1; + /* have the last guy take up the now vacant slot */ + pt->fds[m] = pt->fds[pt->fds_count - 1]; + /* this decrements pt->fds_count */ + lws_plat_delete_socket_from_fds(context, wsi, m); + v = (int) pt->fds[m].fd; + /* end guy's "position in fds table" is now the deletion guy's old one */ + end_wsi = wsi_from_fd(context, v); + if (!end_wsi) { + lwsl_err("no wsi found for fd %d at pos %d, pt->fds_count=%d\n", + (int)pt->fds[m].fd, m, pt->fds_count); + assert(0); + } else + end_wsi->position_in_fds_table = m; + + /* deletion guy's lws_lookup entry needs nuking */ + delete_from_fd(context, wsi->desc.sockfd); + /* removed wsi has no position any more */ + wsi->position_in_fds_table = -1; + } /* remove also from external POLL support via protocol 0 */ if (lws_socket_is_valid(wsi->desc.sockfd) && wsi->vhost && diff --git a/lib/roles/h1/ops-h1.c b/lib/roles/h1/ops-h1.c index c80b61d6..9a4694f3 100644 --- a/lib/roles/h1/ops-h1.c +++ b/lib/roles/h1/ops-h1.c @@ -117,7 +117,7 @@ lws_read_h1(struct lws *wsi, unsigned char *buf, lws_filepos_t len) case LRS_BODY: http_postbody: - lwsl_notice("%s: http post body: remain %d\n", __func__, + lwsl_debug("%s: http post body: remain %d\n", __func__, (int)wsi->http.rx_content_remain); while (len && wsi->http.rx_content_remain) { /* Copy as much as possible, up to the limit of: diff --git a/lib/roles/http/client/client.c b/lib/roles/http/client/client.c index 79811b54..cb2eecd5 100644 --- a/lib/roles/http/client/client.c +++ b/lib/roles/http/client/client.c @@ -51,15 +51,16 @@ lws_client_wsi_effective(struct lws *wsi) /* * return self or the guy we are queued under + * + * REQUIRES VHOST LOCK HELD */ -struct lws * -lws_client_wsi_master(struct lws *wsi) +static struct lws * +_lws_client_wsi_master(struct lws *wsi) { struct lws *wsi_eff = wsi; struct lws_dll_lws *d; - lws_vhost_lock(wsi->vhost); d = wsi->dll_client_transaction_queue.prev; while (d) { wsi_eff = lws_container_of(d, struct lws, @@ -67,7 +68,6 @@ lws_client_wsi_master(struct lws *wsi) d = d->prev; } - lws_vhost_unlock(wsi->vhost); return wsi_eff; } @@ -372,7 +372,7 @@ start_ws_handshake: /* send our request to the server */ lws_latency_pre(context, wsi); - w = lws_client_wsi_master(wsi); + w = _lws_client_wsi_master(wsi); lwsl_info("%s: HANDSHAKE2: %p: sending headers on %p (wsistate 0x%x 0x%x)\n", __func__, wsi, w, wsi->wsistate, w->wsistate); diff --git a/test-apps/test-server-http.c b/test-apps/test-server-http.c index 39f8b098..905a0a83 100644 --- a/test-apps/test-server-http.c +++ b/test-apps/test-server-http.c @@ -162,7 +162,7 @@ file_upload_cb(void *data, const char *name, const char *filename, return 1; n = write((int)(long long)pss->post_fd, buf, len); - lwsl_notice("%s: write %d says %d\n", __func__, len, n); + lwsl_info("%s: write %d says %d\n", __func__, len, n); } if (state == LWS_UFS_CONTENT) break;