From a499b777596f3ad1775c2f903345aa04130f43bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Witold=20Kr=C4=99cicki?= Date: Thu, 21 Nov 2019 09:36:52 +0100 Subject: [PATCH] Make all atomic reads use atomic_ functions --- bin/tests/system/stop.pl | 2 +- lib/isc/netmgr/netmgr.c | 25 ++++++++++++------------- lib/isc/netmgr/tcp.c | 2 +- lib/isc/netmgr/tcpdns.c | 10 +++++----- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/bin/tests/system/stop.pl b/bin/tests/system/stop.pl index 1a78ade59f..a667d446fb 100644 --- a/bin/tests/system/stop.pl +++ b/bin/tests/system/stop.pl @@ -109,7 +109,7 @@ foreach my $name(@ans) { stop_signal($name, "TERM", 1); } -@ans = wait_for_servers(60, @ans); +@ans = wait_for_servers(1200, @ans); # Pass 3: SIGABRT foreach my $name (@ns) { diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index 963fa24a1e..85a0baac43 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -731,7 +731,6 @@ isc__nmsocket_init(isc_nmsocket_t *sock, isc_nm_t *mgr, .inactivehandles = isc_astack_new(mgr->mctx, 60), .inactivereqs = isc_astack_new(mgr->mctx, 60) }; - isc_nm_attach(mgr, &sock->mgr); sock->uv_handle.handle.data = sock; @@ -969,27 +968,27 @@ isc_nmhandle_unref(isc_nmhandle_t *handle) { if (sock->closehandle_cb != NULL) { if (sock->tid == isc_nm_tid()) { sock->closehandle_cb(sock); - - /* - * If we do this asynchronously then - * the async event will clean it up. - */ - if (sock->ah == 0 && - !atomic_load(&sock->active) && - !atomic_load(&sock->destroying)) - { - nmsocket_maybe_destroy(sock); - } } else { - isc__netievent_closecb_t * event = isc__nm_get_ievent(sock->mgr, netievent_closecb); isc_nmsocket_attach(sock, &event->sock); isc__nm_enqueue_ievent(&sock->mgr->workers[sock->tid], (isc__netievent_t *) event); + /* + * If we do this asynchronously then the async event + * will clean the socket, so just exit. + */ + return; } } + + if (atomic_load(&sock->ah) == 0 && + !atomic_load(&sock->active) && + !atomic_load(&sock->destroying)) + { + nmsocket_maybe_destroy(sock); + } } void * diff --git a/lib/isc/netmgr/tcp.c b/lib/isc/netmgr/tcp.c index 457fd6ebbb..3774713897 100644 --- a/lib/isc/netmgr/tcp.c +++ b/lib/isc/netmgr/tcp.c @@ -400,7 +400,7 @@ read_cb(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf) { INSIST(sock->rcb.recv != NULL); sock->rcb.recv(sock->tcphandle, ®ion, sock->rcbarg); - sock->read_timeout = (sock->keepalive + sock->read_timeout = (atomic_load(&sock->keepalive) ? sock->mgr->keepalive_timeout : sock->mgr->idle_timeout); diff --git a/lib/isc/netmgr/tcpdns.c b/lib/isc/netmgr/tcpdns.c index 4a432e7cd2..78d34e8371 100644 --- a/lib/isc/netmgr/tcpdns.c +++ b/lib/isc/netmgr/tcpdns.c @@ -217,7 +217,7 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) { memmove(dnssock->buf + dnssock->buf_len, base, len); dnssock->buf_len += len; - dnssock->read_timeout = (dnssock->keepalive + dnssock->read_timeout = (atomic_load(&dnssock->keepalive) ? dnssock->mgr->keepalive_timeout : dnssock->mgr->idle_timeout); @@ -239,7 +239,7 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) { atomic_store(&dnssock->outer->processing, true); uv_timer_stop(&dnssock->timer); - if (dnssock->sequential) { + if (atomic_load(&dnssock->sequential)) { /* * We're in sequential mode and we processed * one packet, so we're done until the next read @@ -348,8 +348,8 @@ isc_nm_tcpdns_keepalive(isc_nmhandle_t *handle) { return; } - handle->sock->keepalive = true; - handle->sock->outer->keepalive = true; + atomic_store(&handle->sock->keepalive, true); + atomic_store(&handle->sock->outer->keepalive, true); } typedef struct tcpsend { @@ -384,7 +384,7 @@ resume_processing(void *arg) { * For sequential sockets: Process what's in the buffer, or * if there aren't any messages buffered, resume reading. */ - if (sock->sequential) { + if (atomic_load(&sock->sequential)) { isc_nmhandle_t *handle = NULL; result = processbuffer(sock, &handle);