mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Call the isc__nm_udp_send() callbacks asynchronously on shutdown
The isc__nm_udp_send() callback would be called synchronously when shutting down or when the socket has been closed. This could lead to double locking in the calling code and thus those callbacks needs to be called asynchronously.
This commit is contained in:
@@ -685,6 +685,7 @@ isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
|
||||
isc__networker_t *worker = NULL;
|
||||
uint32_t maxudp;
|
||||
int r;
|
||||
isc_result_t result;
|
||||
|
||||
REQUIRE(VALID_NMSOCK(sock));
|
||||
REQUIRE(sock->type == isc_nm_udpsocket);
|
||||
@@ -706,16 +707,6 @@ isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
|
||||
return;
|
||||
}
|
||||
|
||||
if (isc__nm_closing(worker)) {
|
||||
cb(handle, ISC_R_SHUTTINGDOWN, cbarg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
cb(handle, ISC_R_CANCELED, cbarg);
|
||||
return;
|
||||
}
|
||||
|
||||
uvreq = isc__nm_uvreq_get(sock->worker, sock);
|
||||
uvreq->uvbuf.base = (char *)region->base;
|
||||
uvreq->uvbuf.len = region->length;
|
||||
@@ -725,6 +716,16 @@ isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
|
||||
uvreq->cb.send = cb;
|
||||
uvreq->cbarg = cbarg;
|
||||
|
||||
if (isc__nm_closing(worker)) {
|
||||
result = ISC_R_SHUTTINGDOWN;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (isc__nmsocket_closing(sock)) {
|
||||
result = ISC_R_CANCELED;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* We used uv_udp_connect(), so the peer address has to be
|
||||
* set to NULL or else uv_udp_send() could fail or assert,
|
||||
@@ -738,8 +739,12 @@ isc__nm_udp_send(isc_nmhandle_t *handle, const isc_region_t *region,
|
||||
&uvreq->uvbuf, 1, sa, udp_send_cb);
|
||||
if (r < 0) {
|
||||
isc__nm_incstats(sock, STATID_SENDFAIL);
|
||||
isc__nm_failed_send_cb(sock, uvreq, isc_uverr2result(r));
|
||||
result = isc_uverr2result(r);
|
||||
goto fail;
|
||||
}
|
||||
return;
|
||||
fail:
|
||||
isc__nm_failed_send_cb(sock, uvreq, result);
|
||||
}
|
||||
|
||||
static isc_result_t
|
||||
|
Reference in New Issue
Block a user