2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 15:05:23 +00:00

refactor dns_request to use loopmgr callbacks

dns_request_create() and _createraw() now take a 'loop' parameter
and run the callback event on the specified loop.

as the task manager is no longer used, it has been removed from
the dns_requestmgr structure.  the dns_resolver_taskmgr() function
is also no longer used and has been removed.
This commit is contained in:
Evan Hunt
2022-10-25 22:56:48 -07:00
committed by Ondřej Surý
parent d3e2b680d0
commit 106da9c190
11 changed files with 273 additions and 419 deletions

View File

@@ -85,7 +85,6 @@
#define MAXTRIES 0xffffffff
static isc_mem_t *mctx = NULL;
static isc_task_t *global_task = NULL;
static isc_loopmgr_t *loopmgr = NULL;
static dns_requestmgr_t *requestmgr = NULL;
static const char *batchname = NULL;
@@ -186,8 +185,8 @@ rcode_totext(dns_rcode_t rcode) {
}
static void
recvresponse(isc_task_t *task, isc_event_t *event) {
dns_requestevent_t *reqev = (dns_requestevent_t *)event;
recvresponse(void *arg) {
dns_request_t *request = (dns_request_t *)arg;
isc_result_t result;
dns_message_t *query = NULL, *response = NULL;
unsigned int parseflags = 0;
@@ -197,14 +196,12 @@ recvresponse(isc_task_t *task, isc_event_t *event) {
unsigned int styleflags = 0;
dns_messagetextflag_t flags;
UNUSED(task);
query = dns_request_getarg(request);
REQUIRE(reqev != NULL);
query = reqev->ev_arg;
if (reqev->result != ISC_R_SUCCESS) {
result = dns_request_getresult(request);
if (result != ISC_R_SUCCESS) {
fprintf(stderr, "response failed with %s\n",
isc_result_totext(reqev->result));
isc_result_totext(result));
if (continue_on_error) {
goto cleanup;
} else {
@@ -220,8 +217,8 @@ recvresponse(isc_task_t *task, isc_event_t *event) {
parseflags |= DNS_MESSAGEPARSE_IGNORETRUNCATION;
}
msgbuf = dns_request_getanswer(reqev->request);
result = dns_request_getresponse(reqev->request, response, parseflags);
msgbuf = dns_request_getanswer(request);
result = dns_request_getresponse(request, response, parseflags);
CHECK("dns_request_getresponse", result);
styleflags |= DNS_STYLEFLAG_REL_OWNER;
@@ -541,11 +538,9 @@ cleanup:
if (response != NULL) {
dns_message_detach(&response);
}
dns_request_destroy(&reqev->request);
isc_event_free(&event);
dns_request_destroy(&request);
if (--onfly == 0) {
isc_task_detach(&global_task);
isc_loopmgr_shutdown(loopmgr);
}
return;
@@ -754,8 +749,8 @@ sendquery(struct query *query) {
result = dns_request_create(
requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, NULL,
NULL, options, NULL, query->timeout, query->udptimeout,
query->udpretries, global_task, recvresponse, message,
&request);
query->udpretries, isc_loop_main(loopmgr), recvresponse,
message, &request);
CHECK("dns_request_create", result);
return (ISC_R_SUCCESS);
@@ -773,7 +768,6 @@ sendqueries(void *arg) {
}
if (onfly == 0) {
isc_task_detach(&global_task);
isc_loopmgr_shutdown(loopmgr);
}
}
@@ -2135,7 +2129,6 @@ main(int argc, char *argv[]) {
fatal("can't choose between IPv4 and IPv6");
}
RUNCHECK(isc_task_create(taskmgr, &global_task, 0));
RUNCHECK(dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr));
set_source_ports(dispatchmgr);
@@ -2149,7 +2142,7 @@ main(int argc, char *argv[]) {
dispatchmgr, have_src ? &srcaddr : &bind_any, &dispatchvx));
RUNCHECK(dns_requestmgr_create(
mctx, taskmgr, dispatchmgr, have_ipv4 ? dispatchvx : NULL,
mctx, dispatchmgr, have_ipv4 ? dispatchvx : NULL,
have_ipv6 ? dispatchvx : NULL, &requestmgr));
RUNCHECK(dns_view_create(mctx, 0, "_test", &view));