int magic;
isc_nmsocket_t *sock;
isc_nmhandle_t *handle;
- char tcplen[2]; /* The TCP DNS message length */
- uv_buf_t uvbuf; /* translated isc_region_t, to be
- * sent or received */
- isc_sockaddr_t local; /* local address */
- isc_sockaddr_t peer; /* peer address */
- isc__nm_cb_t cb; /* callback */
- void *cbarg; /* callback argument */
- uv_pipe_t ipc; /* used for sending socket
- * uv_handles to other threads */
+ char tcplen[2]; /* The TCP DNS message length */
+ uv_buf_t uvbuf; /* translated isc_region_t, to be
+ * sent or received */
+ isc_sockaddr_t local; /* local address */
+ isc_sockaddr_t peer; /* peer address */
+ isc__nm_cb_t cb; /* callback */
+ void *cbarg; /* callback argument */
+ isc_nm_timer_t *timer; /* TCP write timer */
+
union {
uv_handle_t handle;
uv_req_t req;
/*%
* TCP write timeout timer.
*/
- uv_timer_t write_timer;
uint64_t write_timeout;
- int64_t writes;
/*% outer socket is for 'wrapped' sockets - e.g. tcpdns in tcp */
isc_nmsocket_t *outer;
void
isc__nmsocket_readtimeout_cb(uv_timer_t *timer);
void
-isc__nmsocket_writetimeout_cb(uv_timer_t *timer);
+isc__nmsocket_writetimeout_cb(void *data, isc_result_t eresult);
/*%<
*
}
void
-isc__nmsocket_writetimeout_cb(uv_timer_t *timer) {
- isc_nmsocket_t *sock = uv_handle_get_data((uv_handle_t *)timer);
+isc__nmsocket_writetimeout_cb(void *data, isc_result_t eresult) {
+ isc__nm_uvreq_t *req = data;
+ isc_nmsocket_t *sock = NULL;
- int r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
+ REQUIRE(eresult == ISC_R_TIMEDOUT);
+ REQUIRE(VALID_UVREQ(req));
+ REQUIRE(VALID_NMSOCK(req->sock));
+
+ sock = req->sock;
isc__nmsocket_reset(sock);
}
nmhandle_detach_cb(&ievent->handle FLARG_PASS);
}
+static void
+reset_shutdown(uv_handle_t *handle) {
+ isc_nmsocket_t *sock = uv_handle_get_data(handle);
+
+ isc__nmsocket_shutdown(sock);
+}
+
void
isc__nmsocket_reset(isc_nmsocket_t *sock) {
REQUIRE(VALID_NMSOCK(sock));
* The real shutdown will be handled in the respective
* close functions.
*/
- int r = uv_tcp_close_reset(&sock->uv_handle.tcp, NULL);
+ int r = uv_tcp_close_reset(&sock->uv_handle.tcp,
+ reset_shutdown);
UV_RUNTIME_CHECK(uv_tcp_close_reset, r);
}
- isc__nmsocket_shutdown(sock);
}
void
REQUIRE(VALID_NMSOCK(handle->sock));
if (isc_refcount_decrement(&timer->references) == 1) {
- uv_timer_stop(&timer->timer);
+ int r = uv_timer_stop(&timer->timer);
+ UV_RUNTIME_CHECK(uv_timer_stop, r);
uv_close((uv_handle_t *)&timer->timer, timer_destroy);
}
}
static void
failed_accept_cb(isc_nmsocket_t *sock, isc_result_t eresult);
-static void
-failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
- isc_result_t eresult);
static void
stop_tcp_parent(isc_nmsocket_t *sock);
static void
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
if (r != 0) {
isc__nm_closesocket(sock->fd);
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
LOCK(&sock->parent->lock);
r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
}
}
-static void
-failed_send_cb(isc_nmsocket_t *sock, isc__nm_uvreq_t *req,
- isc_result_t eresult) {
- REQUIRE(VALID_NMSOCK(sock));
- REQUIRE(VALID_UVREQ(req));
-
- if (req->cb.send != NULL) {
- isc__nm_sendcb(sock, req, eresult, true);
- } else {
- isc__nm_uvreq_put(&req, sock);
- }
-}
-
void
isc__nm_tcp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg) {
REQUIRE(VALID_NMHANDLE(handle));
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&csock->read_timer, csock);
- r = uv_timer_init(&worker->loop, &csock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&csock->write_timer, csock);
-
r = uv_accept(&ssock->uv_handle.stream, &csock->uv_handle.stream);
if (r != 0) {
result = isc__nm_uverr2result(r);
static void
tcp_send_cb(uv_write_t *req, int status) {
isc__nm_uvreq_t *uvreq = (isc__nm_uvreq_t *)req->data;
+ isc_nmsocket_t *sock = NULL;
REQUIRE(VALID_UVREQ(uvreq));
- REQUIRE(VALID_NMHANDLE(uvreq->handle));
+ REQUIRE(VALID_NMSOCK(uvreq->sock));
- isc_nmsocket_t *sock = uvreq->sock;
+ sock = uvreq->sock;
- if (--sock->writes == 0) {
- int r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
- }
+ isc_nm_timer_stop(uvreq->timer);
+ isc_nm_timer_detach(&uvreq->timer);
if (status < 0) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_SENDFAIL]);
- failed_send_cb(sock, uvreq, isc__nm_uverr2result(status));
+ isc__nm_failed_send_cb(sock, uvreq,
+ isc__nm_uverr2result(status));
return;
}
result = tcp_send_direct(sock, uvreq);
if (result != ISC_R_SUCCESS) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_SENDFAIL]);
- failed_send_cb(sock, uvreq, result);
+ isc__nm_failed_send_cb(sock, uvreq, result);
}
}
return (ISC_R_CANCELED);
}
- r = uv_timer_start(&sock->write_timer, isc__nmsocket_writetimeout_cb,
- sock->write_timeout, 0);
- UV_RUNTIME_CHECK(uv_timer_start, r);
- RUNTIME_CHECK(sock->writes++ >= 0);
-
r = uv_write(&req->uv_req.write, &sock->uv_handle.stream, &req->uvbuf,
1, tcp_send_cb);
if (r < 0) {
return (isc__nm_uverr2result(r));
}
+ isc_nm_timer_create(req->handle, isc__nmsocket_writetimeout_cb, req,
+ &req->timer);
+ if (sock->write_timeout > 0) {
+ isc_nm_timer_start(req->timer, sock->write_timeout);
+ }
+
return (ISC_R_SUCCESS);
}
}
}
-static void
-write_timer_close_cb(uv_handle_t *timer) {
- isc_nmsocket_t *sock = uv_handle_get_data(timer);
- uv_handle_set_data(timer, NULL);
-
- REQUIRE(VALID_NMSOCK(sock));
-
- uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
static void
stop_tcp_child(isc_nmsocket_t *sock) {
REQUIRE(sock->type == isc_nm_tcpsocket);
static void
tcp_close_direct(isc_nmsocket_t *sock) {
- int r;
-
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(atomic_load(&sock->closing));
isc__nmsocket_timer_stop(sock);
isc__nm_stop_reading(sock);
- r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
- uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+ uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+ uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
}
void
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
if (isc__nm_closing(sock)) {
result = ISC_R_CANCELED;
goto error;
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
LOCK(&sock->parent->lock);
r = uv_tcp_open(&sock->uv_handle.tcp, sock->fd);
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&csock->read_timer, csock);
- r = uv_timer_init(&worker->loop, &csock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&csock->write_timer, csock);
-
r = uv_accept(&ssock->uv_handle.stream, &csock->uv_handle.stream);
if (r != 0) {
result = isc__nm_uverr2result(r);
isc_nmsocket_t *sock = NULL;
REQUIRE(VALID_UVREQ(uvreq));
- REQUIRE(VALID_NMHANDLE(uvreq->handle));
+ REQUIRE(VALID_NMSOCK(uvreq->sock));
sock = uvreq->sock;
- if (--sock->writes == 0) {
- int r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
- }
+ isc_nm_timer_stop(uvreq->timer);
+ isc_nm_timer_detach(&uvreq->timer);
if (status < 0) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_SENDFAIL]);
goto fail;
}
- r = uv_timer_start(&sock->write_timer, isc__nmsocket_writetimeout_cb,
- sock->write_timeout, 0);
- UV_RUNTIME_CHECK(uv_timer_start, r);
- RUNTIME_CHECK(sock->writes++ >= 0);
-
r = uv_write(&uvreq->uv_req.write, &sock->uv_handle.stream, bufs, nbufs,
tcpdns_send_cb);
if (r < 0) {
goto fail;
}
+ isc_nm_timer_create(uvreq->handle, isc__nmsocket_writetimeout_cb, uvreq,
+ &uvreq->timer);
+ if (sock->write_timeout > 0) {
+ isc_nm_timer_start(uvreq->timer, sock->write_timeout);
+ }
+
return;
fail:
if (result != ISC_R_SUCCESS) {
}
}
-static void
-write_timer_close_cb(uv_handle_t *timer) {
- isc_nmsocket_t *sock = uv_handle_get_data(timer);
- uv_handle_set_data(timer, NULL);
-
- REQUIRE(VALID_NMSOCK(sock));
-
- uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
static void
stop_tcpdns_child(isc_nmsocket_t *sock) {
REQUIRE(sock->type == isc_nm_tcpdnssocket);
static void
tcpdns_close_direct(isc_nmsocket_t *sock) {
- int r;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid == isc_nm_tid());
REQUIRE(atomic_load(&sock->closing));
isc__nmsocket_timer_stop(sock);
isc__nm_stop_reading(sock);
- r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
- uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+ uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+ uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
}
void
static void
read_timer_close_cb(uv_handle_t *handle);
-static void
-write_timer_close_cb(uv_handle_t *handle);
-
static void
udp_close_direct(isc_nmsocket_t *sock);
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
LOCK(&sock->parent->lock);
r = uv_udp_open(&sock->uv_handle.udp, sock->fd);
UV_RUNTIME_CHECK(uv_timer_init, r);
uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- r = uv_timer_init(&worker->loop, &sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_init, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
-
r = uv_udp_open(&sock->uv_handle.udp, sock->fd);
if (r != 0) {
isc__nm_incstats(sock->mgr, sock->statsindex[STATID_OPENFAIL]);
}
}
-static void
-write_timer_close_cb(uv_handle_t *timer) {
- isc_nmsocket_t *sock = uv_handle_get_data(timer);
- uv_handle_set_data(timer, NULL);
-
- REQUIRE(VALID_NMSOCK(sock));
-
- uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
- uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
-}
-
static void
stop_udp_child(isc_nmsocket_t *sock) {
REQUIRE(sock->type == isc_nm_udpsocket);
static void
udp_close_direct(isc_nmsocket_t *sock) {
- int r;
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(sock->tid == isc_nm_tid());
- r = uv_timer_stop(&sock->write_timer);
- UV_RUNTIME_CHECK(uv_timer_stop, r);
- uv_handle_set_data((uv_handle_t *)&sock->write_timer, sock);
- uv_close((uv_handle_t *)&sock->write_timer, write_timer_close_cb);
+ uv_handle_set_data((uv_handle_t *)&sock->read_timer, sock);
+ uv_close((uv_handle_t *)&sock->read_timer, read_timer_close_cb);
}
void