mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 22:15:20 +00:00
modify reference counting within netmgr
- isc__nmhandle_get() now attaches to the sock in the nmhandle object. the caller is responsible for dereferencing the original socket pointer when necessary. - tcpdns listener sockets attach sock->outer to the outer tcp listener socket. tcpdns connected sockets attach sock->outerhandle to the handle for the tcp connected socket. - only listener sockets need to be attached/detached directly. connected sockets should only be accessed and reference-counted via their associated handles.
This commit is contained in:
committed by
Witold Kręcicki
parent
9e740cad21
commit
5ea26ee1f1
@@ -82,7 +82,6 @@ static void
|
||||
timer_close_cb(uv_handle_t *handle) {
|
||||
isc_nmsocket_t *sock = (isc_nmsocket_t *)uv_handle_get_data(handle);
|
||||
INSIST(VALID_NMSOCK(sock));
|
||||
isc__nmsocket_detach(&sock);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -123,7 +122,10 @@ dnslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
|
||||
dnssock->extrahandlesize = dnslistensock->extrahandlesize;
|
||||
isc__nmsocket_attach(dnslistensock, &dnssock->listener);
|
||||
isc__nmsocket_attach(handle->sock, &dnssock->outer);
|
||||
|
||||
dnssock->outerhandle = handle;
|
||||
isc_nmhandle_ref(dnssock->outerhandle);
|
||||
|
||||
dnssock->peer = handle->sock->peer;
|
||||
dnssock->read_timeout = handle->sock->mgr->init;
|
||||
dnssock->tid = isc_nm_tid();
|
||||
@@ -136,7 +138,11 @@ dnslisten_acceptcb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
uv_timer_start(&dnssock->timer, dnstcp_readtimeout,
|
||||
dnssock->read_timeout, 0);
|
||||
|
||||
isc_nm_read(handle, dnslisten_readcb, dnssock);
|
||||
isc_nmhandle_ref(handle);
|
||||
result = isc_nm_read(handle, dnslisten_readcb, dnssock);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
isc_nmhandle_unref(handle);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -188,6 +194,11 @@ processbuffer(isc_nmsocket_t *dnssock, isc_nmhandle_t **handlep) {
|
||||
dnssock->buf_len);
|
||||
}
|
||||
|
||||
/*
|
||||
* dnssock is now attached to dnshandle
|
||||
*/
|
||||
isc__nmsocket_detach(&dnssock);
|
||||
|
||||
*handlep = dnshandle;
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
@@ -244,7 +255,7 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) {
|
||||
/*
|
||||
* We have a packet: stop timeout timers
|
||||
*/
|
||||
atomic_store(&dnssock->outer->processing, true);
|
||||
atomic_store(&dnssock->outerhandle->sock->processing, true);
|
||||
if (dnssock->timer_initialized) {
|
||||
uv_timer_stop(&dnssock->timer);
|
||||
}
|
||||
@@ -255,7 +266,7 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) {
|
||||
* one packet, so we're done until the next read
|
||||
* completes.
|
||||
*/
|
||||
isc_nm_pauseread(dnssock->outer);
|
||||
isc_nm_pauseread(dnssock->outerhandle->sock);
|
||||
done = true;
|
||||
} else {
|
||||
/*
|
||||
@@ -267,7 +278,7 @@ dnslisten_readcb(isc_nmhandle_t *handle, isc_region_t *region, void *arg) {
|
||||
*/
|
||||
if (atomic_load(&dnssock->ah) >=
|
||||
TCPDNS_CLIENTS_PER_CONN) {
|
||||
isc_nm_pauseread(dnssock->outer);
|
||||
isc_nm_pauseread(dnssock->outerhandle->sock);
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
@@ -326,7 +337,7 @@ isc__nm_tcpdns_stoplistening(isc_nmsocket_t *sock) {
|
||||
sock->rcbarg = NULL;
|
||||
|
||||
if (sock->outer != NULL) {
|
||||
isc_nm_stoplistening(sock->outer);
|
||||
isc__nm_tcp_stoplistening(sock->outer);
|
||||
isc__nmsocket_detach(&sock->outer);
|
||||
}
|
||||
}
|
||||
@@ -336,7 +347,8 @@ isc_nm_tcpdns_sequential(isc_nmhandle_t *handle) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
||||
if (handle->sock->type != isc_nm_tcpdnssocket ||
|
||||
handle->sock->outer == NULL) {
|
||||
handle->sock->outerhandle == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -348,7 +360,7 @@ isc_nm_tcpdns_sequential(isc_nmhandle_t *handle) {
|
||||
* closehandle_cb callback, called whenever a handle
|
||||
* is released.
|
||||
*/
|
||||
isc_nm_pauseread(handle->sock->outer);
|
||||
isc_nm_pauseread(handle->sock->outerhandle->sock);
|
||||
atomic_store(&handle->sock->sequential, true);
|
||||
}
|
||||
|
||||
@@ -357,12 +369,13 @@ isc_nm_tcpdns_keepalive(isc_nmhandle_t *handle) {
|
||||
REQUIRE(VALID_NMHANDLE(handle));
|
||||
|
||||
if (handle->sock->type != isc_nm_tcpdnssocket ||
|
||||
handle->sock->outer == NULL) {
|
||||
handle->sock->outerhandle == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
atomic_store(&handle->sock->keepalive, true);
|
||||
atomic_store(&handle->sock->outer->keepalive, true);
|
||||
atomic_store(&handle->sock->outerhandle->sock->keepalive, true);
|
||||
}
|
||||
|
||||
typedef struct tcpsend {
|
||||
@@ -382,13 +395,13 @@ resume_processing(void *arg) {
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->tid == isc_nm_tid());
|
||||
|
||||
if (sock->type != isc_nm_tcpdnssocket || sock->outer == NULL) {
|
||||
if (sock->type != isc_nm_tcpdnssocket || sock->outerhandle == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (atomic_load(&sock->ah) == 0) {
|
||||
/* Nothing is active; sockets can timeout now */
|
||||
atomic_store(&sock->outer->processing, false);
|
||||
atomic_store(&sock->outerhandle->sock->processing, false);
|
||||
if (sock->timer_initialized) {
|
||||
uv_timer_start(&sock->timer, dnstcp_readtimeout,
|
||||
sock->read_timeout, 0);
|
||||
@@ -404,13 +417,14 @@ resume_processing(void *arg) {
|
||||
|
||||
result = processbuffer(sock, &handle);
|
||||
if (result == ISC_R_SUCCESS) {
|
||||
atomic_store(&sock->outer->processing, true);
|
||||
atomic_store(&sock->outerhandle->sock->processing,
|
||||
true);
|
||||
if (sock->timer_initialized) {
|
||||
uv_timer_stop(&sock->timer);
|
||||
}
|
||||
isc_nmhandle_unref(handle);
|
||||
} else if (sock->outer != NULL) {
|
||||
isc_nm_resumeread(sock->outer);
|
||||
} else if (sock->outerhandle != NULL) {
|
||||
isc_nm_resumeread(sock->outerhandle->sock);
|
||||
}
|
||||
|
||||
return;
|
||||
@@ -428,8 +442,8 @@ resume_processing(void *arg) {
|
||||
/*
|
||||
* Nothing in the buffer; resume reading.
|
||||
*/
|
||||
if (sock->outer != NULL) {
|
||||
isc_nm_resumeread(sock->outer);
|
||||
if (sock->outerhandle != NULL) {
|
||||
isc_nm_resumeread(sock->outerhandle->sock);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -438,7 +452,7 @@ resume_processing(void *arg) {
|
||||
if (sock->timer_initialized) {
|
||||
uv_timer_stop(&sock->timer);
|
||||
}
|
||||
atomic_store(&sock->outer->processing, true);
|
||||
atomic_store(&sock->outerhandle->sock->processing, true);
|
||||
isc_nmhandle_unref(dnshandle);
|
||||
} while (atomic_load(&sock->ah) < TCPDNS_CLIENTS_PER_CONN);
|
||||
}
|
||||
@@ -447,13 +461,13 @@ static void
|
||||
tcpdnssend_cb(isc_nmhandle_t *handle, isc_result_t result, void *cbarg) {
|
||||
tcpsend_t *ts = (tcpsend_t *)cbarg;
|
||||
|
||||
UNUSED(handle);
|
||||
|
||||
ts->cb(ts->orighandle, result, ts->cbarg);
|
||||
isc_mem_put(ts->mctx, ts->region.base, ts->region.length);
|
||||
|
||||
isc_nmhandle_unref(ts->orighandle);
|
||||
isc_mem_putanddetach(&ts->mctx, ts, sizeof(*ts));
|
||||
|
||||
isc_nmhandle_unref(handle);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -471,7 +485,7 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->type == isc_nm_tcpdnssocket);
|
||||
|
||||
if (sock->outer == NULL) {
|
||||
if (sock->outerhandle == NULL) {
|
||||
/* The socket is closed */
|
||||
return (ISC_R_NOTCONNECTED);
|
||||
}
|
||||
@@ -480,7 +494,7 @@ isc__nm_tcpdns_send(isc_nmhandle_t *handle, isc_region_t *region,
|
||||
*t = (tcpsend_t){
|
||||
.cb = cb,
|
||||
.cbarg = cbarg,
|
||||
.handle = handle->sock->outer->tcphandle,
|
||||
.handle = handle->sock->outerhandle,
|
||||
};
|
||||
|
||||
isc_mem_attach(sock->mgr->mctx, &t->mctx);
|
||||
@@ -515,14 +529,16 @@ tcpdns_close_direct(isc_nmsocket_t *sock) {
|
||||
* At this point we're certain that there are no external
|
||||
* references, we can close everything.
|
||||
*/
|
||||
if (sock->outer != NULL) {
|
||||
sock->outer->rcb.recv = NULL;
|
||||
isc__nmsocket_detach(&sock->outer);
|
||||
if (sock->outerhandle != NULL) {
|
||||
sock->outerhandle->sock->rcb.recv = NULL;
|
||||
isc_nmhandle_unref(sock->outerhandle);
|
||||
sock->outerhandle = NULL;
|
||||
}
|
||||
if (sock->listener != NULL) {
|
||||
isc__nmsocket_detach(&sock->listener);
|
||||
}
|
||||
atomic_store(&sock->closed, true);
|
||||
isc__nmsocket_prep_destroy(sock);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user