* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: request.c,v 1.44 2000/12/19 03:36:48 marka Exp $ */
+/* $Id: request.c,v 1.45 2000/12/22 19:39:01 gson Exp $ */
#include <config.h>
#define DNS_REQUEST_F_CONNECTING 0x0001
#define DNS_REQUEST_F_CANCELED 0x0002
-#define DNS_REQUEST_F_DESTROYED 0x0004 /* dns_request_destroy() called */
+#define DNS_REQUEST_F_TIMEDOUT 0x0004 /* cancelled due to a timeout */
#define DNS_REQUEST_F_TCP 0x0008 /* This request used TCP */
#define DNS_REQUEST_CANCELED(r) \
(((r)->flags & DNS_REQUEST_F_CANCELED) != 0)
#define DNS_REQUEST_CONNECTING(r) \
(((r)->flags & DNS_REQUEST_F_CONNECTING) != 0)
-#define DNS_REQUEST_DESTROYED(r) \
- (((r)->flags & DNS_REQUEST_F_DESTROYED) != 0)
+#define DNS_REQUEST_TIMEDOUT(r) \
+ (((r)->flags & DNS_REQUEST_F_TIMEDOUT) != 0)
/***
LOCK(&request->requestmgr->locks[request->hash]);
if (!DNS_REQUEST_CANCELED(request)) {
req_cancel(request);
- req_sendevent(request, ISC_R_CANCELED);
+ if (!DNS_REQUEST_CONNECTING(request))
+ req_sendevent(request, ISC_R_CANCELED);
}
UNLOCK(&request->requestmgr->locks[request->hash]);
return (ISC_R_SUCCESS);
void
dns_request_destroy(dns_request_t **requestp) {
dns_request_t *request;
- isc_boolean_t need_destroy = ISC_FALSE;
REQUIRE(requestp != NULL && VALID_REQUEST(*requestp));
LOCK(&request->requestmgr->lock);
ISC_LIST_UNLINK(request->requestmgr->requests, request, link);
UNLOCK(&request->requestmgr->lock);
- if (!DNS_REQUEST_CONNECTING(request))
- need_destroy = ISC_TRUE;
- request->flags |= DNS_REQUEST_F_DESTROYED;
+ INSIST(!DNS_REQUEST_CONNECTING(request));
UNLOCK(&request->requestmgr->locks[request->hash]);
- if (need_destroy)
- req_destroy(request);
+ req_destroy(request);
*requestp = NULL;
}
isc_socketevent_t *sevent = (isc_socketevent_t *)event;
isc_result_t result;
dns_request_t *request = event->ev_arg;
- isc_boolean_t need_destroy = ISC_FALSE;
REQUIRE(event->ev_type == ISC_SOCKEVENT_CONNECT);
REQUIRE(VALID_REQUEST(request));
request->flags &= ~DNS_REQUEST_F_CONNECTING;
if (DNS_REQUEST_CANCELED(request)) {
- if (DNS_REQUEST_DESTROYED(request))
- need_destroy = ISC_TRUE;
+ /*
+ * Send delayed event.
+ */
+ if (DNS_REQUEST_TIMEDOUT(request))
+ req_sendevent(request, ISC_R_TIMEDOUT);
+ else
+ req_sendevent(request, ISC_R_CANCELED);
} else {
dns_dispatch_starttcp(request->dispatch);
result = sevent->result;
}
}
UNLOCK(&request->requestmgr->locks[request->hash]);
- if (need_destroy)
- req_destroy(request);
isc_event_free(&event);
}
UNUSED(task);
LOCK(&request->requestmgr->locks[request->hash]);
+ request->flags |= DNS_REQUEST_F_TIMEDOUT;
req_cancel(request);
- req_sendevent(request, ISC_R_TIMEDOUT);
+ if (!DNS_REQUEST_CONNECTING(request))
+ req_sendevent(request, ISC_R_TIMEDOUT);
UNLOCK(&request->requestmgr->locks[request->hash]);
isc_event_free(&event);
}