atomic_bool connected;
atomic_bool accepting;
atomic_bool reading;
+ atomic_bool timedout;
isc_refcount_t references;
/*%
atomic_init(&sock->connecting, false);
atomic_init(&sock->keepalive, false);
atomic_init(&sock->connected, false);
+ atomic_init(&sock->timedout, false);
atomic_init(&sock->active_child_connections, 0);
sock->tls.pending_req = NULL;
}
- /* Call the connect callback directly */
-
- req->cb.connect(req->handle, ISC_R_TIMEDOUT, req->cbarg);
+ /*
+ * Mark the connection as timed out and shutdown the socket.
+ */
- /* Timer is not running, cleanup and shutdown everything */
- if (!isc__nmsocket_timer_running(sock)) {
- INSIST(atomic_compare_exchange_strong(&sock->connecting,
- &(bool){ true }, false));
- isc__nm_uvreq_put(&req, sock);
- isc__nmsocket_clearcb(sock);
- isc__nmsocket_shutdown(sock);
- }
+ INSIST(atomic_compare_exchange_strong(&sock->timedout, &(bool){ false },
+ true));
+ isc__nmsocket_clearcb(sock);
+ isc__nmsocket_shutdown(sock);
}
void
isc__nmsocket_timer_stop(sock);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- if (!atomic_load(&sock->connecting)) {
- return;
- }
-
req = uv_handle_get_data((uv_handle_t *)uvreq);
REQUIRE(VALID_UVREQ(req));
REQUIRE(VALID_NMHANDLE(req->handle));
+ if (atomic_load(&sock->timedout)) {
+ result = ISC_R_TIMEDOUT;
+ goto error;
+ }
+
if (!atomic_load(&sock->connecting)) {
/*
* The connect was cancelled from timeout; just clean up
isc__nmsocket_timer_stop(sock);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- if (!atomic_load(&sock->connecting)) {
- return;
- }
-
req = uv_handle_get_data((uv_handle_t *)uvreq);
REQUIRE(VALID_UVREQ(req));
REQUIRE(VALID_NMHANDLE(req->handle));
+ if (atomic_load(&sock->timedout)) {
+ result = ISC_R_TIMEDOUT;
+ goto error;
+ }
+
if (isc__nm_closing(sock)) {
/* Network manager shutting down */
result = ISC_R_SHUTTINGDOWN;
goto error;
} else if (status == UV_ETIMEDOUT) {
/* Timeout status code here indicates hard error */
- result = ISC_R_CANCELED;
+ result = ISC_R_TIMEDOUT;
goto error;
} else if (status != 0) {
result = isc__nm_uverr2result(status);
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid == isc_nm_tid());
- if (!atomic_load(&sock->connecting)) {
- return;
- }
-
req = uv_handle_get_data((uv_handle_t *)uvreq);
REQUIRE(VALID_UVREQ(req));
REQUIRE(VALID_NMHANDLE(req->handle));
+ if (atomic_load(&sock->timedout)) {
+ result = ISC_R_TIMEDOUT;
+ goto error;
+ }
+
if (isc__nm_closing(sock)) {
/* Network manager shutting down */
result = ISC_R_SHUTTINGDOWN;
goto error;
} else if (status == UV_ETIMEDOUT) {
/* Timeout status code here indicates hard error */
- result = ISC_R_CANCELED;
+ result = ISC_R_TIMEDOUT;
goto error;
} else if (status != 0) {
result = isc__nm_uverr2result(status);