From 45ec3ce369287a4bd5a271fd78ddbeff4c3a3869 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 8 Aug 2019 16:58:55 +0100 Subject: [PATCH] lws_dll: upgrade all instances to lws_dll2 lws_dll2 removes the downsides of lws_dll and adds new features like a running member count and explicit owner type... it's cleaner and more robust (eg, nodes know their owner, so they can casually switch between list owners and remove themselves without the code knowing the owner). This deprecates lws_dll, but since it's public it allows it to continue to be built for 4.0 release if you give cmake LWS_WITH_DEPRECATED_LWS_DLL. All remaining internal users of lws_dll are migrated to lws_dll2. --- CMakeLists.txt | 7 ++- cmake/lws_config.h.in | 1 + include/libwebsockets/lws-misc.h | 9 ++++ lib/core-net/close.c | 8 ++- lib/core-net/dummy-callback.c | 20 ++++---- lib/core-net/pollfd.c | 25 +++------ lib/core-net/private.h | 16 +++--- lib/core-net/service.c | 8 +-- lib/core-net/vhost.c | 6 +-- lib/core-net/wsi-timeout.c | 64 ++++++++++++------------ lib/roles/dbus/dbus.c | 14 +++--- lib/roles/dbus/private.h | 4 +- lib/roles/http/client/client-handshake.c | 11 ++-- lib/roles/http/client/client.c | 3 +- lib/roles/ws/ops-ws.c | 15 +++--- lib/roles/ws/private.h | 2 +- lib/tls/mbedtls/ssl.c | 7 ++- lib/tls/openssl/openssl-client.c | 6 +-- lib/tls/openssl/openssl-server.c | 7 ++- lib/tls/openssl/private.h | 4 +- lib/tls/openssl/ssl.c | 8 +-- lib/tls/private-network.h | 6 +-- lib/tls/tls-network.c | 13 ++--- 23 files changed, 130 insertions(+), 134 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 620469b06..31570c5f1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,6 +129,7 @@ option(LWS_WITH_LEJP_CONF "With LEJP configuration parser as used by lwsws" OFF) option(LWS_WITH_ZLIB "Include zlib support (required for extensions)" OFF) option(LWS_WITH_BUNDLED_ZLIB "Use bundled zlib version (Windows only)" ${LWS_WITH_BUNDLED_ZLIB_DEFAULT}) option(LWS_WITH_MINIZ "Use miniz instead of zlib" OFF) +option(LWS_WITH_DEPRECATED_LWS_DLL "Migrate to lws_dll2 instead ASAP" OFF) # # to use miniz, enable both LWS_WITH_ZLIB and LWS_WITH_MINIZ # @@ -934,7 +935,6 @@ set(SOURCES lib/core/alloc.c lib/core/buflist.c lib/core/context.c - lib/core/lws_dll.c lib/core/lws_dll2.c lib/core/libwebsockets.c lib/core/logs.c @@ -942,6 +942,11 @@ set(SOURCES lib/core/vfs.c lib/misc/lws-ring.c ) + +if (LWS_WITH_DEPRECATED_LWS_DLL) + list(APPEND SOURCES + lib/core/lws_dll.c) +endif() if (LWS_WITH_NETWORK) list(APPEND SOURCES diff --git a/cmake/lws_config.h.in b/cmake/lws_config.h.in index 8336e3d51..23ac4459c 100644 --- a/cmake/lws_config.h.in +++ b/cmake/lws_config.h.in @@ -95,6 +95,7 @@ #cmakedefine LWS_WITH_BORINGSSL #cmakedefine LWS_WITH_CGI #cmakedefine LWS_WITH_CUSTOM_HEADERS +#cmakedefine LWS_WITH_DEPRECATED_LWS_DLL #cmakedefine LWS_WITH_DIR #cmakedefine LWS_WITH_ESP32 #cmakedefine LWS_WITH_FTS diff --git a/include/libwebsockets/lws-misc.h b/include/libwebsockets/lws-misc.h index 9293befb6..99247dd73 100644 --- a/include/libwebsockets/lws-misc.h +++ b/include/libwebsockets/lws-misc.h @@ -171,6 +171,14 @@ * doubly linked-list */ +#if defined (LWS_WITH_DEPRECATED_LWS_DLL) + +/* + * This is going away in v4.1. You can set the cmake option above to keep it + * around temporarily. Migrate your stuff to the more capable and robust + * lws_dll2 below + */ + struct lws_dll { struct lws_dll *prev; struct lws_dll *next; @@ -219,6 +227,7 @@ lws_dll_foreach_safe(struct lws_dll *phead, void *user, #define lws_dll_is_detached(___dll, __head) \ (!(___dll)->prev && !(___dll)->next && (__head)->prev != (___dll)) +#endif /* * lws_dll2_owner / lws_dll2 : more capable version of lws_dll. Differences: diff --git a/lib/core-net/close.c b/lib/core-net/close.c index b9d591e12..211673897 100644 --- a/lib/core-net/close.c +++ b/lib/core-net/close.c @@ -44,8 +44,7 @@ __lws_free_wsi(struct lws *wsi) wsi->vhost->lserv_wsi = NULL; #if !defined(LWS_NO_CLIENT) if (wsi->vhost) - lws_dll_remove_track_tail(&wsi->dll_cli_active_conns, - &wsi->vhost->dll_cli_active_conns_head); + lws_dll2_remove(&wsi->dll_cli_active_conns); #endif wsi->context->count_wsi_allocated--; @@ -164,8 +163,7 @@ __lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, if (wsi->vhost) { /* we are no longer an active client connection that can piggyback */ - lws_dll_remove_track_tail(&wsi->dll_cli_active_conns, - &wsi->vhost->dll_cli_active_conns_head); + lws_dll2_remove(&wsi->dll_cli_active_conns); if (rl != -1l) lws_vhost_lock(wsi->vhost); @@ -438,7 +436,7 @@ just_kill_connection: */ __lws_ssl_remove_wsi_from_buffered_list(wsi); __lws_remove_from_timeout_list(wsi); - lws_dll_remove_track_tail(&wsi->dll_hrtimer, &pt->dll_hrtimer_head); + lws_dll2_remove(&wsi->dll_hrtimer); //if (wsi->told_event_loop_closed) // cgi std close case (dummy-callback) // return; diff --git a/lib/core-net/dummy-callback.c b/lib/core-net/dummy-callback.c index a45eee332..a552eef1c 100644 --- a/lib/core-net/dummy-callback.c +++ b/lib/core-net/dummy-callback.c @@ -84,7 +84,7 @@ stream_close(struct lws *wsi) #endif struct lws_proxy_pkt { - struct lws_dll pkt_list; + struct lws_dll2 pkt_list; size_t len; char binary; char first; @@ -99,7 +99,7 @@ lws_callback_ws_proxy(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { struct lws_proxy_pkt *pkt; - struct lws_dll *dll; + struct lws_dll2 *dll; switch (reason) { @@ -162,12 +162,12 @@ lws_callback_ws_proxy(struct lws *wsi, enum lws_callback_reasons reason, memcpy(((uint8_t *)&pkt[1]) + LWS_PRE, in, len); - lws_dll_add_tail(&pkt->pkt_list, &wsi->parent->ws->proxy_head); + lws_dll2_add_tail(&pkt->pkt_list, &wsi->parent->ws->proxy_owner); lws_callback_on_writable(wsi->parent); break; case LWS_CALLBACK_CLIENT_WRITEABLE: - dll = lws_dll_get_tail(&wsi->ws->proxy_head); + dll = lws_dll2_get_tail(&wsi->ws->proxy_owner); if (!dll) break; @@ -180,10 +180,10 @@ lws_callback_ws_proxy(struct lws *wsi, enum lws_callback_reasons reason, wsi->parent->ws->proxy_buffered -= pkt->len; - lws_dll_remove_track_tail(dll, &wsi->ws->proxy_head); + lws_dll2_remove(dll); lws_free(pkt); - if (lws_dll_get_tail(&wsi->ws->proxy_head)) + if (lws_dll2_get_tail(&wsi->ws->proxy_owner)) lws_callback_on_writable(wsi); break; @@ -209,12 +209,12 @@ lws_callback_ws_proxy(struct lws *wsi, enum lws_callback_reasons reason, memcpy(((uint8_t *)&pkt[1]) + LWS_PRE, in, len); - lws_dll_add_tail(&pkt->pkt_list, &wsi->child_list->ws->proxy_head); + lws_dll2_add_tail(&pkt->pkt_list, &wsi->child_list->ws->proxy_owner); lws_callback_on_writable(wsi->child_list); break; case LWS_CALLBACK_SERVER_WRITEABLE: - dll = lws_dll_get_tail(&wsi->ws->proxy_head); + dll = lws_dll2_get_tail(&wsi->ws->proxy_owner); if (!dll) break; @@ -225,10 +225,10 @@ lws_callback_ws_proxy(struct lws *wsi, enum lws_callback_reasons reason, pkt->first, pkt->final)) < 0) return -1; - lws_dll_remove_track_tail(dll, &wsi->ws->proxy_head); + lws_dll2_remove(dll); lws_free(pkt); - if (lws_dll_get_tail(&wsi->ws->proxy_head)) + if (lws_dll2_get_tail(&wsi->ws->proxy_owner)) lws_callback_on_writable(wsi); break; diff --git a/lib/core-net/pollfd.c b/lib/core-net/pollfd.c index 6ba677bc1..f122ad1e8 100644 --- a/lib/core-net/pollfd.c +++ b/lib/core-net/pollfd.c @@ -498,13 +498,9 @@ lws_same_vh_protocol_insert(struct lws *wsi, int n) { lws_vhost_lock(wsi->vhost); - if (!lws_dll_is_detached(&wsi->same_vh_protocol, - &wsi->vhost->same_vh_protocol_heads[n])) - lws_dll_remove_track_tail(&wsi->same_vh_protocol, - &wsi->vhost->same_vh_protocol_heads[n]); - - lws_dll_add_head(&wsi->same_vh_protocol, - &wsi->vhost->same_vh_protocol_heads[n]); + lws_dll2_remove(&wsi->same_vh_protocol); + lws_dll2_add_head(&wsi->same_vh_protocol, + &wsi->vhost->same_vh_protocol_owner[n]); wsi->bound_vhost_index = n; @@ -514,15 +510,8 @@ lws_same_vh_protocol_insert(struct lws *wsi, int n) void __lws_same_vh_protocol_remove(struct lws *wsi) { - struct lws_dll *head; - - if (!wsi->vhost || !wsi->vhost->same_vh_protocol_heads) - return; - - head = &wsi->vhost->same_vh_protocol_heads[(int)wsi->bound_vhost_index]; - - if (!lws_dll_is_detached(&wsi->same_vh_protocol, head)) - lws_dll_remove_track_tail(&wsi->same_vh_protocol, head); + if (wsi->vhost && wsi->vhost->same_vh_protocol_owner) + lws_dll2_remove(&wsi->same_vh_protocol); } void @@ -557,8 +546,8 @@ lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost, n = (int)(protocol - vhost->protocols); - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - vhost->same_vh_protocol_heads[n].next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + lws_dll2_get_head(&vhost->same_vh_protocol_owner[n])) { wsi = lws_container_of(d, struct lws, same_vh_protocol); assert(wsi->protocol == protocol); diff --git a/lib/core-net/private.h b/lib/core-net/private.h index d56e3bb89..499fa5fc7 100644 --- a/lib/core-net/private.h +++ b/lib/core-net/private.h @@ -277,8 +277,8 @@ struct lws_context_per_thread { */ unsigned char *serv_buf; - struct lws_dll dll_timeout_head; - struct lws_dll dll_hrtimer_head; + struct lws_dll2_owner dll_timeout_owner; + struct lws_dll2_owner dll_hrtimer_head; struct lws_dll2_owner dll_buflist_owner; /* guys with pending rxflow */ struct lws_dll2_owner seq_owner; /* list of lws_sequencer-s */ struct lws_dll2_owner seq_pend_owner; /* lws_seq-s with pending evts */ @@ -428,12 +428,12 @@ struct lws_vhost { void **protocol_vh_privs; const struct lws_protocol_vhost_options *pvo; const struct lws_protocol_vhost_options *headers; - struct lws_dll *same_vh_protocol_heads; + struct lws_dll2_owner *same_vh_protocol_owner; struct lws_vhost *no_listener_vhost_list; struct lws_dll2_owner abstract_instances_owner; #if !defined(LWS_NO_CLIENT) - struct lws_dll dll_cli_active_conns_head; + struct lws_dll2_owner dll_cli_active_conns_owner; #endif #if defined(LWS_WITH_TLS) @@ -512,12 +512,12 @@ struct lws { struct lws *sibling_list; /* subsequent children at same level */ const struct lws_protocols *protocol; - struct lws_dll same_vh_protocol; + struct lws_dll2 same_vh_protocol; lws_seq_t *seq; /* associated sequencer if any */ - struct lws_dll dll_timeout; - struct lws_dll dll_hrtimer; + struct lws_dll2 dll_timeout; + struct lws_dll2 dll_hrtimer; struct lws_dll2 dll_buflist; /* guys with pending rxflow */ #if defined(LWS_WITH_THREADPOOL) @@ -532,7 +532,7 @@ struct lws { #ifndef LWS_NO_CLIENT struct client_info_stash *stash; char *cli_hostname_copy; - struct lws_dll dll_cli_active_conns; + struct lws_dll2 dll_cli_active_conns; struct lws_dll2_owner dll2_cli_txn_queue_owner; struct lws_dll2 dll2_cli_txn_queue; #endif diff --git a/lib/core-net/service.c b/lib/core-net/service.c index a52942144..552df0c6e 100644 --- a/lib/core-net/service.c +++ b/lib/core-net/service.c @@ -568,8 +568,8 @@ lws_service_flag_pending(struct lws_context *context, int tsi) * service to use up the buffered incoming data, even though their * network socket may have nothing */ - lws_start_foreach_dll_safe(struct lws_dll *, p, p1, - pt->tls.dll_pending_tls_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, p, p1, + lws_dll2_get_head(&pt->tls.dll_pending_tls_owner)) { struct lws *wsi = lws_container_of(p, struct lws, tls.dll_pending_tls); @@ -693,8 +693,8 @@ lws_service_periodic_checks(struct lws_context *context, lws_pt_lock(pt, __func__); - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - context->pt[tsi].dll_timeout_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + lws_dll2_get_head(&context->pt[tsi].dll_timeout_owner)) { wsi = lws_container_of(d, struct lws, dll_timeout); tmp_fd = wsi->desc.sockfd; diff --git a/lib/core-net/vhost.c b/lib/core-net/vhost.c index 6d478acf0..69fe26a53 100644 --- a/lib/core-net/vhost.c +++ b/lib/core-net/vhost.c @@ -631,8 +631,8 @@ lws_create_vhost(struct lws_context *context, vh->protocols = lwsp; vh->allocated_vhost_protocols = 1; - vh->same_vh_protocol_heads = (struct lws_dll *) - lws_zalloc(sizeof(struct lws_dll) * + vh->same_vh_protocol_owner = (struct lws_dll2_owner *) + lws_zalloc(sizeof(struct lws_dll2_owner) * vh->count_protocols, "same vh list"); #if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2) vh->http.mount_list = info->mounts; @@ -1088,7 +1088,7 @@ __lws_vhost_destroy2(struct lws_vhost *vh) if (vh->protocol_vh_privs) lws_free(vh->protocol_vh_privs); lws_ssl_SSL_CTX_destroy(vh); - lws_free(vh->same_vh_protocol_heads); + lws_free(vh->same_vh_protocol_owner); if (context->plugin_list || (context->options & LWS_SERVER_OPTION_EXPLICIT_VHOSTS) || diff --git a/lib/core-net/wsi-timeout.c b/lib/core-net/wsi-timeout.c index 5702badc4..369fa95ac 100644 --- a/lib/core-net/wsi-timeout.c +++ b/lib/core-net/wsi-timeout.c @@ -24,9 +24,7 @@ void __lws_remove_from_timeout_list(struct lws *wsi) { - struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi]; - - lws_dll_remove_track_tail(&wsi->dll_timeout, &pt->dll_timeout_head); + lws_dll2_remove(&wsi->dll_timeout); } void @@ -41,39 +39,40 @@ lws_remove_from_timeout_list(struct lws *wsi) void -__lws_set_timer_usecs(struct lws *wsi, lws_usec_t usecs) +__lws_set_timer_usecs(struct lws *wsi, lws_usec_t us) { struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi]; - struct lws_dll *target = NULL; - struct timeval now; - struct lws *wsi1; - int bef = 0; - lws_dll_remove_track_tail(&wsi->dll_hrtimer, &pt->dll_hrtimer_head); + lws_dll2_remove(&wsi->dll_hrtimer); - if (usecs == LWS_SET_TIMER_USEC_CANCEL) + if (us == LWS_SET_TIMER_USEC_CANCEL) return; - gettimeofday(&now, NULL); - wsi->pending_timer = ((now.tv_sec * 1000000ll) + now.tv_usec) + usecs; + wsi->pending_timer = lws_now_usecs() + us; /* * we sort the hrtimer list with the earliest timeout first */ - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - pt->dll_hrtimer_head.next) { - target = d; - wsi1 = lws_container_of(d, struct lws, dll_hrtimer); + lws_start_foreach_dll_safe(struct lws_dll2 *, p, tp, + pt->dll_hrtimer_head.head) { + struct lws *w = lws_container_of(p, struct lws, dll_hrtimer); - if (wsi1->pending_timer >= wsi->pending_timer) { - /* d, dprev's next, is >= our time */ - bef = 1; - break; + assert(w->pending_timer); /* shouldn't be on the list otherwise */ + if (w->pending_timer >= wsi->pending_timer) { + /* drop us in before this guy */ + lws_dll2_add_before(&wsi->dll_hrtimer, &w->dll_hrtimer); + + return; } - } lws_end_foreach_dll_safe(d, d1); + } lws_end_foreach_dll_safe(p, tp); - lws_dll_insert(&wsi->dll_hrtimer, target, &pt->dll_hrtimer_head, bef); + /* + * Either nobody on the list yet to compare him to, or he's the + * longest timeout... stick him at the tail end + */ + + lws_dll2_add_tail(&wsi->dll_hrtimer, &pt->dll_hrtimer_head); } LWS_VISIBLE void @@ -89,8 +88,8 @@ __lws_hrtimer_service(struct lws_context_per_thread *pt, lws_usec_t t) { struct lws *wsi; - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - pt->dll_hrtimer_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + lws_dll2_get_head(&pt->dll_hrtimer_head)) { wsi = lws_container_of(d, struct lws, dll_hrtimer); /* @@ -113,11 +112,11 @@ __lws_hrtimer_service(struct lws_context_per_thread *pt, lws_usec_t t) /* return an estimate how many us until next timer hit */ - if (!pt->dll_hrtimer_head.next) + if (!lws_dll2_get_head(&pt->dll_hrtimer_head)) return 0; /* there is nothing pending */ - wsi = lws_container_of(pt->dll_hrtimer_head.next, struct lws, - dll_hrtimer); + wsi = lws_container_of(lws_dll2_get_head(&pt->dll_hrtimer_head), + struct lws, dll_hrtimer); t = lws_now_usecs(); if (wsi->pending_timer <= t) /* in the past */ @@ -134,14 +133,17 @@ __lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs) time(&now); - lwsl_debug("%s: %p: %d secs (reason %d)\n", __func__, wsi, secs, reason); + lwsl_debug("%s: %p: %d secs, reason %d\n", __func__, wsi, secs, reason); + wsi->pending_timeout_limit = secs; wsi->pending_timeout_set = now; wsi->pending_timeout = reason; - lws_dll_remove_track_tail(&wsi->dll_timeout, &pt->dll_timeout_head); - if (reason) - lws_dll_add_head(&wsi->dll_timeout, &pt->dll_timeout_head); + lws_dll2_remove(&wsi->dll_timeout); + if (!reason) + return; + + lws_dll2_add_head(&wsi->dll_timeout, &pt->dll_timeout_owner); } LWS_VISIBLE void diff --git a/lib/roles/dbus/dbus.c b/lib/roles/dbus/dbus.c index 42a3a2278..60cfea278 100644 --- a/lib/roles/dbus/dbus.c +++ b/lib/roles/dbus/dbus.c @@ -288,7 +288,7 @@ lws_dbus_add_timeout(DBusTimeout *t, void *data) dbt->fire = ti + (ms < 1000); dbt->timer_list.prev = NULL; dbt->timer_list.next = NULL; - lws_dll_add_front(&dbt->timer_list, &pt->dbus.timer_list_head); + lws_dll2_add_head(&dbt->timer_list, &pt->dbus.timer_list_owner); ctx->timeouts++; @@ -303,12 +303,12 @@ lws_dbus_remove_timeout(DBusTimeout *t, void *data) lwsl_info("%s: t %p, data %p\n", __func__, t, data); - lws_start_foreach_dll_safe(struct lws_dll *, rdt, nx, - pt->dbus.timer_list_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx, + lws_dll2_get_head(&pt->dbus.timer_list_owner)) { struct lws_role_dbus_timer *r = lws_container_of(rdt, struct lws_role_dbus_timer, timer_list); if (t == r->data) { - lws_dll_remove_track_tail(rdt, &pt->dbus.timer_list_head); + lws_dll2_remove(rdt); lws_free(rdt); ctx->timeouts--; break; @@ -480,15 +480,15 @@ rops_periodic_checks_dbus(struct lws_context *context, int tsi, time_t now) * service thread can modify stuff on the same pt. */ - lws_start_foreach_dll_safe(struct lws_dll *, rdt, nx, - pt->dbus.timer_list_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, rdt, nx, + lws_dll2_get_head(&pt->dbus.timer_list_owner)) { struct lws_role_dbus_timer *r = lws_container_of(rdt, struct lws_role_dbus_timer, timer_list); if (now > r->fire) { lwsl_notice("%s: firing timer\n", __func__); dbus_timeout_handle(r->data); - lws_dll_remove_track_tail(rdt, &pt->dbus.timer_list_head); + lws_dll2_remove(rdt); lws_free(rdt); } } lws_end_foreach_dll_safe(rdt, nx); diff --git a/lib/roles/dbus/private.h b/lib/roles/dbus/private.h index c35b50199..5d7a9acdd 100644 --- a/lib/roles/dbus/private.h +++ b/lib/roles/dbus/private.h @@ -28,13 +28,13 @@ extern struct lws_role_ops role_ops_dbus; #define lwsi_role_dbus(wsi) (wsi->role_ops == &role_ops_dbus) struct lws_role_dbus_timer { - struct lws_dll timer_list; + struct lws_dll2 timer_list; void *data; time_t fire; }; struct lws_pt_role_dbus { - struct lws_dll timer_list_head; + struct lws_dll2_owner timer_list_owner; }; struct _lws_dbus_mode_related { diff --git a/lib/roles/http/client/client-handshake.c b/lib/roles/http/client/client-handshake.c index ce763019a..a2767c53a 100644 --- a/lib/roles/http/client/client-handshake.c +++ b/lib/roles/http/client/client-handshake.c @@ -270,8 +270,8 @@ lws_client_connect_2(struct lws *wsi) lws_vhost_lock(wsi->vhost); /* ----------------------------------- { */ - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - wsi->vhost->dll_cli_active_conns_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + lws_dll2_get_head(&wsi->vhost->dll_cli_active_conns_owner)) { struct lws *w = lws_container_of(d, struct lws, dll_cli_active_conns); @@ -367,12 +367,11 @@ create_new_conn: if (meth && (!strcmp(meth, "GET") || !strcmp(meth, "POST")) && lws_dll2_is_detached(&wsi->dll2_cli_txn_queue) && - lws_dll_is_detached(&wsi->dll_cli_active_conns, - &wsi->vhost->dll_cli_active_conns_head)) { + lws_dll2_is_detached(&wsi->dll_cli_active_conns)) { lws_vhost_lock(wsi->vhost); /* caution... we will have to unpick this on oom4 path */ - lws_dll_add_head(&wsi->dll_cli_active_conns, - &wsi->vhost->dll_cli_active_conns_head); + lws_dll2_add_head(&wsi->dll_cli_active_conns, + &wsi->vhost->dll_cli_active_conns_owner); lws_vhost_unlock(wsi->vhost); } diff --git a/lib/roles/http/client/client.c b/lib/roles/http/client/client.c index 357ac86f0..8fe2516aa 100644 --- a/lib/roles/http/client/client.c +++ b/lib/roles/http/client/client.c @@ -604,8 +604,7 @@ lws_http_transaction_completed_client(struct lws *wsi) * If not, that's it for us. */ - if (lws_dll_is_detached(&wsi->dll_cli_active_conns, - &wsi->vhost->dll_cli_active_conns_head)) + if (lws_dll2_is_detached(&wsi->dll_cli_active_conns)) return -1; /* if this was a queued guy, close him and remove from queue */ diff --git a/lib/roles/ws/ops-ws.c b/lib/roles/ws/ops-ws.c index aa8ad3315..782913644 100644 --- a/lib/roles/ws/ops-ws.c +++ b/lib/roles/ws/ops-ws.c @@ -1497,12 +1497,13 @@ rops_periodic_checks_ws(struct lws_context *context, int tsi, time_t now) for (n = 0; n < vh->count_protocols; n++) { - lws_start_foreach_dll_safe(struct lws_dll *, d, d1, - vh->same_vh_protocol_heads[n].next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + lws_dll2_get_head(&vh->same_vh_protocol_owner[n])) { struct lws *wsi = lws_container_of(d, struct lws, same_vh_protocol); - if (lwsi_role_ws(wsi) && !wsi->http2_substream && + if (lwsi_role_ws(wsi) && + !wsi->http2_substream && !wsi->socket_is_permanently_unusable && !wsi->ws->send_check_ping && wsi->ws->time_next_ping_check && @@ -1510,7 +1511,8 @@ rops_periodic_checks_ws(struct lws_context *context, int tsi, time_t now) wsi->ws->time_next_ping_check) > context->ws_ping_pong_interval) { - lwsl_info("%s: req pp on wsi %p\n", __func__, wsi); + lwsl_info("%s: req pp on wsi %p\n", + __func__, wsi); wsi->ws->send_check_ping = 1; lws_set_timeout(wsi, PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING, @@ -1523,6 +1525,7 @@ rops_periodic_checks_ws(struct lws_context *context, int tsi, time_t now) } lws_vhost_unlock(vh); + vh = vh->vhost_next; } @@ -2072,7 +2075,7 @@ rops_destroy_vhost_ws(struct lws_vhost *vh) #if defined(LWS_WITH_HTTP_PROXY) static int -ws_destroy_proxy_buf(struct lws_dll *d, void *user) +ws_destroy_proxy_buf(struct lws_dll2 *d, void *user) { lws_free(d); @@ -2084,7 +2087,7 @@ static int rops_destroy_role_ws(struct lws *wsi) { #if defined(LWS_WITH_HTTP_PROXY) - lws_dll_foreach_safe(&wsi->ws->proxy_head, NULL, ws_destroy_proxy_buf); + lws_dll2_foreach_safe(&wsi->ws->proxy_owner, NULL, ws_destroy_proxy_buf); #endif lws_free_set_NULL(wsi->ws); diff --git a/lib/roles/ws/private.h b/lib/roles/ws/private.h index c31bfb166..eee4331bc 100644 --- a/lib/roles/ws/private.h +++ b/lib/roles/ws/private.h @@ -94,7 +94,7 @@ struct _lws_websocket_related { #endif #if defined(LWS_WITH_HTTP_PROXY) - struct lws_dll proxy_head; + struct lws_dll2_owner proxy_owner; char actual_protocol[16]; size_t proxy_buffered; #endif diff --git a/lib/tls/mbedtls/ssl.c b/lib/tls/mbedtls/ssl.c index 478ff7256..d79c69536 100644 --- a/lib/tls/mbedtls/ssl.c +++ b/lib/tls/mbedtls/ssl.c @@ -125,10 +125,9 @@ lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len) goto bail; if (SSL_pending(wsi->tls.ssl) && - lws_dll_is_detached(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head)) - lws_dll_add_head(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head); + lws_dll2_is_detached(&wsi->tls.dll_pending_tls)) + lws_dll2_add_head(&wsi->tls.dll_pending_tls, + &pt->tls.dll_pending_tls_owner); return n; bail: diff --git a/lib/tls/openssl/openssl-client.c b/lib/tls/openssl/openssl-client.c index 8bdea9ff1..f822f631c 100644 --- a/lib/tls/openssl/openssl-client.c +++ b/lib/tls/openssl/openssl-client.c @@ -480,8 +480,8 @@ lws_tls_client_create_vhost_context(struct lws_vhost *vh, /* look for existing client context with same config already */ - lws_start_foreach_dll_safe(struct lws_dll *, p, tp, - vh->context->tls.cc_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, p, tp, + lws_dll2_get_head(&vh->context->tls.cc_owner)) { tcr = lws_container_of(p, struct lws_tls_client_reuse, cc_list); if (!memcmp(hash, tcr->hash, len)) { @@ -522,7 +522,7 @@ lws_tls_client_create_vhost_context(struct lws_vhost *vh, tcr->refcount = 1; memcpy(tcr->hash, hash, len); tcr->index = vh->context->tls.count_client_contexts++; - lws_dll_add_front(&tcr->cc_list, &vh->context->tls.cc_head); + lws_dll2_add_head(&tcr->cc_list, &vh->context->tls.cc_owner); lwsl_info("%s: vh %s: created new client ctx %d\n", __func__, vh->name, tcr->index); diff --git a/lib/tls/openssl/openssl-server.c b/lib/tls/openssl/openssl-server.c index b030077d8..917c0eae3 100644 --- a/lib/tls/openssl/openssl-server.c +++ b/lib/tls/openssl/openssl-server.c @@ -632,10 +632,9 @@ lws_tls_server_accept(struct lws *wsi) lws_openssl_describe_cipher(wsi); if (SSL_pending(wsi->tls.ssl) && - lws_dll_is_detached(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head)) - lws_dll_add_head(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head); + lws_dll2_is_detached(&wsi->tls.dll_pending_tls)) + lws_dll2_add_head(&wsi->tls.dll_pending_tls, + &pt->tls.dll_pending_tls_owner); return LWS_SSL_CAPABLE_DONE; } diff --git a/lib/tls/openssl/private.h b/lib/tls/openssl/private.h index 028a4b290..bd0b174ac 100644 --- a/lib/tls/openssl/private.h +++ b/lib/tls/openssl/private.h @@ -23,13 +23,13 @@ /* * one of these per different client context - * cc_head is in lws_context.lws_context_tls + * cc_owner is in lws_context.lws_context_tls */ struct lws_tls_client_reuse { lws_tls_ctx *ssl_client_ctx; uint8_t hash[32]; - struct lws_dll cc_list; + struct lws_dll2 cc_list; int refcount; int index; }; diff --git a/lib/tls/openssl/ssl.c b/lib/tls/openssl/ssl.c index 1b424ba52..63d4c964b 100644 --- a/lib/tls/openssl/ssl.c +++ b/lib/tls/openssl/ssl.c @@ -127,7 +127,7 @@ lws_ssl_destroy_client_ctx(struct lws_vhost *vhost) vhost->context->tls.count_client_contexts--; - lws_dll_remove_track_tail(&tcr->cc_list, &vhost->context->tls.cc_head); + lws_dll2_remove(&tcr->cc_list); lws_free(tcr); } @@ -280,9 +280,9 @@ lws_ssl_capable_read(struct lws *wsi, unsigned char *buf, int len) goto bail; if (SSL_pending(wsi->tls.ssl) && - lws_dll_is_detached(&wsi->tls.dll_pending_tls, &pt->tls.dll_pending_tls_head)) - lws_dll_add_head(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head); + lws_dll2_is_detached(&wsi->tls.dll_pending_tls)) + lws_dll2_add_head(&wsi->tls.dll_pending_tls, + &pt->tls.dll_pending_tls_owner); return n; bail: diff --git a/lib/tls/private-network.h b/lib/tls/private-network.h index 5f4ae9e51..bd6889134 100644 --- a/lib/tls/private-network.h +++ b/lib/tls/private-network.h @@ -31,12 +31,12 @@ struct lws_context_tls { char alpn_discovered[32]; const char *alpn_default; time_t last_cert_check_s; - struct lws_dll cc_head; + struct lws_dll2_owner cc_owner; int count_client_contexts; }; struct lws_pt_tls { - struct lws_dll dll_pending_tls_head; + struct lws_dll2_owner dll_pending_tls_owner; }; struct lws_tls_ss_pieces; @@ -70,7 +70,7 @@ struct lws_vhost_tls { struct lws_lws_tls { lws_tls_conn *ssl; lws_tls_bio *client_bio; - struct lws_dll dll_pending_tls; + struct lws_dll2 dll_pending_tls; unsigned int use_ssl; unsigned int redirect_to_https:1; }; diff --git a/lib/tls/tls-network.c b/lib/tls/tls-network.c index 43d7f772e..3e24c4522 100644 --- a/lib/tls/tls-network.c +++ b/lib/tls/tls-network.c @@ -32,8 +32,8 @@ lws_tls_fake_POLLIN_for_buffered(struct lws_context_per_thread *pt) { int ret = 0; - lws_start_foreach_dll_safe(struct lws_dll *, p, p1, - pt->tls.dll_pending_tls_head.next) { + lws_start_foreach_dll_safe(struct lws_dll2 *, p, p1, + lws_dll2_get_head(&pt->tls.dll_pending_tls_owner)) { struct lws *wsi = lws_container_of(p, struct lws, tls.dll_pending_tls); @@ -49,14 +49,7 @@ lws_tls_fake_POLLIN_for_buffered(struct lws_context_per_thread *pt) void __lws_ssl_remove_wsi_from_buffered_list(struct lws *wsi) { - struct lws_context_per_thread *pt = &wsi->context->pt[(int)wsi->tsi]; - - if (lws_dll_is_detached(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head)) - return; - - lws_dll_remove_track_tail(&wsi->tls.dll_pending_tls, - &pt->tls.dll_pending_tls_head); + lws_dll2_remove(&wsi->tls.dll_pending_tls); } void