mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-03 08:05:21 +00:00
dns_request_cancel needs to be callable from any thread
Check the tid and cancel the request immediately or pass it to the appropriate loop for processing. Call request->cb directly from req_sendevent as it is now always called with the correct tid.
This commit is contained in:
@@ -745,8 +745,8 @@ cleanup:
|
|||||||
return (result);
|
return (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
dns_request_cancel(dns_request_t *request) {
|
request_cancel(dns_request_t *request) {
|
||||||
REQUIRE(VALID_REQUEST(request));
|
REQUIRE(VALID_REQUEST(request));
|
||||||
REQUIRE(request->tid == isc_tid());
|
REQUIRE(request->tid == isc_tid());
|
||||||
|
|
||||||
@@ -759,6 +759,26 @@ dns_request_cancel(dns_request_t *request) {
|
|||||||
req_sendevent(request, ISC_R_CANCELED); /* call asynchronously */
|
req_sendevent(request, ISC_R_CANCELED); /* call asynchronously */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
req_cancel_cb(void *arg) {
|
||||||
|
dns_request_t *request = arg;
|
||||||
|
|
||||||
|
request_cancel(request);
|
||||||
|
dns_request_unref(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dns_request_cancel(dns_request_t *request) {
|
||||||
|
REQUIRE(VALID_REQUEST(request));
|
||||||
|
|
||||||
|
if (request->tid == isc_tid()) {
|
||||||
|
request_cancel(request);
|
||||||
|
} else {
|
||||||
|
dns_request_ref(request);
|
||||||
|
isc_async_run(request->loop, req_cancel_cb, request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
isc_result_t
|
isc_result_t
|
||||||
dns_request_getresponse(dns_request_t *request, dns_message_t *message,
|
dns_request_getresponse(dns_request_t *request, dns_message_t *message,
|
||||||
unsigned int options) {
|
unsigned int options) {
|
||||||
@@ -959,6 +979,11 @@ req_sendevent(dns_request_t *request, isc_result_t result) {
|
|||||||
|
|
||||||
request->result = result;
|
request->result = result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not call request->cb directly as it introduces a dead lock
|
||||||
|
* between dns_zonemgr_shutdown and sendtoprimary in lib/dns/zone.c
|
||||||
|
* zone->lock.
|
||||||
|
*/
|
||||||
dns_request_ref(request);
|
dns_request_ref(request);
|
||||||
isc_async_run(request->loop, req_sendevent_cb, request);
|
isc_async_run(request->loop, req_sendevent_cb, request);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user