void
isc__nm_readcb(isc_nmsocket_t *sock, isc__nm_uvreq_t *uvreq,
- isc_result_t eresult);
+ isc_result_t eresult, bool async);
void
isc__nm_async_readcb(isc__networker_t *worker, isc__netievent_t *ev0);
uint64_t write_timeout);
void
-isc__nm_tls_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result);
+isc__nm_tls_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async);
void
isc__nm_http_stoplistening(isc_nmsocket_t *sock);
NETIEVENT_SOCKET_DECL(sockstop);
void
-isc__nm_udp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result);
+isc__nm_udp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async);
void
-isc__nm_tcp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result);
+isc__nm_tcp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async);
void
-isc__nm_tcpdns_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result);
+isc__nm_tcpdns_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async);
void
isc__nm_tlsdns_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
bool async);
REQUIRE(VALID_NMSOCK(sock));
switch (sock->type) {
case isc_nm_udpsocket:
- isc__nm_udp_failed_read_cb(sock, result);
+ isc__nm_udp_failed_read_cb(sock, result, async);
return;
case isc_nm_tcpsocket:
- isc__nm_tcp_failed_read_cb(sock, result);
+ isc__nm_tcp_failed_read_cb(sock, result, async);
return;
case isc_nm_tcpdnssocket:
- isc__nm_tcpdns_failed_read_cb(sock, result);
+ isc__nm_tcpdns_failed_read_cb(sock, result, async);
return;
case isc_nm_tlsdnssocket:
isc__nm_tlsdns_failed_read_cb(sock, result, async);
return;
#ifdef HAVE_LIBNGHTTP2
case isc_nm_tlssocket:
- isc__nm_tls_failed_read_cb(sock, result);
+ isc__nm_tls_failed_read_cb(sock, result, async);
return;
#endif
default:
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
- isc__nm_readcb(sock, req, ISC_R_TIMEDOUT);
+ isc__nm_readcb(sock, req, ISC_R_TIMEDOUT, false);
}
if (!isc__nmsocket_timer_running(sock)) {
void
isc__nm_readcb(isc_nmsocket_t *sock, isc__nm_uvreq_t *uvreq,
- isc_result_t eresult) {
+ isc_result_t eresult, bool async) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(VALID_UVREQ(uvreq));
REQUIRE(VALID_NMHANDLE(uvreq->handle));
- if (eresult == ISC_R_SUCCESS || eresult == ISC_R_TIMEDOUT) {
+ if (!async) {
isc__netievent_readcb_t ievent = { .type = netievent_readcb,
.sock = sock,
.req = uvreq,
.result = eresult };
isc__nm_async_readcb(NULL, (isc__netievent_t *)&ievent);
- } else {
- isc__netievent_readcb_t *ievent = isc__nm_get_netievent_readcb(
- sock->worker, sock, uvreq, eresult);
- isc__nm_enqueue_ievent(sock->worker,
- (isc__netievent_t *)ievent);
+ return;
}
+
+ isc__netievent_readcb_t *ievent = isc__nm_get_netievent_readcb(
+ sock->worker, sock, uvreq, eresult);
+ isc__nm_enqueue_ievent(sock->worker, (isc__netievent_t *)ievent);
}
void
}
void
-isc__nm_tcp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result) {
+isc__nm_tcp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(result != ISC_R_SUCCESS);
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
isc__nmsocket_clearcb(sock);
- isc__nm_readcb(sock, req, result);
+ isc__nm_readcb(sock, req, result, async);
}
destroy:
return;
failure:
sock->reading = true;
- isc__nm_tcp_failed_read_cb(sock, result);
+ isc__nm_tcp_failed_read_cb(sock, result, true);
}
void
isc__nm_tcp_read_stop(isc_nmhandle_t *handle) {
- isc_nmsocket_t *sock = NULL;
-
REQUIRE(VALID_NMHANDLE(handle));
+ REQUIRE(VALID_NMSOCK(handle->sock));
- sock = handle->sock;
-
- REQUIRE(VALID_NMSOCK(sock));
+ isc_nmsocket_t *sock = handle->sock;
isc__nmsocket_timer_stop(sock);
isc__nm_stop_reading(sock);
netmgr = sock->worker->netmgr;
if (isc__nmsocket_closing(sock)) {
- isc__nm_tcp_failed_read_cb(sock, ISC_R_CANCELED);
+ isc__nm_tcp_failed_read_cb(sock, ISC_R_CANCELED, false);
goto free;
}
isc__nm_incstats(sock, STATID_RECVFAIL);
}
- isc__nm_tcp_failed_read_cb(sock, isc_uverr2result(nread));
+ isc__nm_tcp_failed_read_cb(sock, isc_uverr2result(nread),
+ false);
goto free;
}
: atomic_load(&netmgr->idle));
}
- isc__nm_readcb(sock, req, ISC_R_SUCCESS);
+ isc__nm_readcb(sock, req, ISC_R_SUCCESS, false);
/* The readcb could have paused the reading */
if (sock->reading) {
}
void
-isc__nm_tcpdns_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result) {
+isc__nm_tcpdns_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(result != ISC_R_SUCCESS);
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
isc__nmsocket_clearcb(sock);
- isc__nm_readcb(sock, req, result);
+ isc__nm_readcb(sock, req, result, async);
}
destroy:
*/
REQUIRE(sock->processing == false);
sock->processing = true;
- isc__nm_readcb(sock, req, ISC_R_SUCCESS);
+ isc__nm_readcb(sock, req, ISC_R_SUCCESS, false);
sock->processing = false;
len += 2;
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
isc__nmsocket_clearcb(sock);
- isc__nm_readcb(sock, req, result);
+ isc__nm_readcb(sock, req, result, async);
}
destroy:
*/
REQUIRE(sock->processing == false);
sock->processing = true;
- isc__nm_readcb(sock, req, ISC_R_SUCCESS);
+ isc__nm_readcb(sock, req, ISC_R_SUCCESS, false);
sock->processing = false;
len += 2;
}
void
-isc__nm_tls_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result) {
+isc__nm_tls_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async) {
+ UNUSED(async);
+
if (!inactive(sock) && sock->tlsstream.state == TLS_IO) {
tls_do_bio(sock, NULL, NULL, true);
} else if (sock->reading) {
REQUIRE(VALID_NMHANDLE(handle));
REQUIRE(VALID_NMSOCK(handle->sock));
- handle->sock->reading = false;
+ isc_nmsocket_t *sock = handle->sock;
+
+ sock->reading = false;
- if (handle->sock->outerhandle != NULL) {
- isc_nm_read_stop(handle->sock->outerhandle);
+ if (sock->outerhandle != NULL) {
+ isc_nm_read_stop(sock->outerhandle);
}
}
REQUIRE(!sock->processing);
sock->processing = true;
- isc__nm_readcb(sock, req, ISC_R_SUCCESS);
+ isc__nm_readcb(sock, req, ISC_R_SUCCESS, false);
sock->processing = false;
free:
}
void
-isc__nm_udp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result) {
+isc__nm_udp_failed_read_cb(isc_nmsocket_t *sock, isc_result_t result,
+ bool async) {
REQUIRE(VALID_NMSOCK(sock));
REQUIRE(result != ISC_R_SUCCESS);
REQUIRE(sock->tid == isc_tid());
if (!sock->recv_read) {
goto destroy;
}
- sock->recv_read = false;
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
isc__nmsocket_clearcb(sock);
- isc__nm_readcb(sock, req, result);
+ isc__nm_readcb(sock, req, result, async);
}
+ sock->recv_read = false;
+
destroy:
isc__nmsocket_prep_destroy(sock);
return;
if (sock->recv_cb != NULL) {
isc__nm_uvreq_t *req = isc__nm_get_read_req(sock, NULL);
- isc__nm_readcb(sock, req, result);
+ isc__nm_readcb(sock, req, result, async);
}
}
fail:
sock->reading = true; /* required by the next call */
- isc__nm_failed_read_cb(sock, result, false);
+ isc__nm_failed_read_cb(sock, result, true);
}
static void