void
dns_dispatch_cancel(dns_dispentry_t **respp) {
dns_dispentry_t *resp = NULL;
+ dns_dispatch_t *disp = NULL;
REQUIRE(respp != NULL);
REQUIRE(VALID_RESPONSE(resp));
+ disp = resp->disp;
resp->canceled = true;
/* Connected UDP. */
goto done;
}
+ LOCK(&disp->lock);
/* TCP pending connection. */
if (ISC_LINK_LINKED(resp, plink)) {
dns_dispentry_t *copy = resp;
- ISC_LIST_UNLINK(resp->disp->pending, resp, plink);
+ ISC_LIST_UNLINK(disp->pending, resp, plink);
if (resp->connected != NULL) {
resp->connected(ISC_R_CANCELED, NULL, resp->arg);
}
* dns_dispatch_done().
*/
dispentry_detach(©);
+ UNLOCK(&disp->lock);
goto done;
}
* unless this is the last resp waiting.
*/
if (ISC_LINK_LINKED(resp, alink)) {
- ISC_LIST_UNLINK(resp->disp->active, resp, alink);
- if (ISC_LIST_EMPTY(resp->disp->active) &&
- resp->disp->handle != NULL) {
- isc_nm_cancelread(resp->disp->handle);
+ ISC_LIST_UNLINK(disp->active, resp, alink);
+ if (ISC_LIST_EMPTY(disp->active) && disp->handle != NULL) {
+ isc_nm_cancelread(disp->handle);
} else if (resp->response != NULL) {
resp->response(ISC_R_CANCELED, NULL, resp->arg);
}
}
+ UNLOCK(&disp->lock);
done:
dns_dispatch_done(&resp);