static void
udp_noresponse_read_cb(isc_nmhandle_t *handle, isc_result_t eresult,
isc_region_t *region, void *cbarg) {
- UNUSED(handle);
UNUSED(region);
UNUSED(cbarg);
isc_nmhandle_t *readhandle = NULL;
isc_nmhandle_t *sendhandle = NULL;
- UNUSED(handle);
- UNUSED(cbarg);
-
isc_refcount_decrement(&active_cconnects);
assert_int_equal(eresult, ISC_R_SUCCESS);
isc_nmhandle_t *readhandle = NULL;
isc_nmhandle_t *sendhandle = NULL;
- UNUSED(cbarg);
-
F();
isc_refcount_decrement(&active_cconnects);
isc_job_run(loopmgr, udp_connect_udpconnect, netmgr);
}
+static void
+udp_shutdown_read_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult,
+ isc_region_t *region, void *cbarg) {
+ uint64_t magic = 0;
+
+ UNUSED(cbarg);
+
+ assert_non_null(handle);
+
+ F();
+
+ assert_int_equal(eresult, ISC_R_SUCCESS);
+
+ assert_true(region->length == sizeof(magic));
+
+ memmove(&magic, region->base, sizeof(magic));
+ assert_true(magic == send_magic);
+}
+
+static void
+udp_shutdown_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult,
+ void *cbarg) {
+ UNUSED(cbarg);
+
+ F();
+
+ assert_non_null(handle);
+ assert_int_equal(eresult, ISC_R_SUCCESS);
+
+ atomic_fetch_add(&csends, 1);
+
+ isc_loopmgr_shutdown(loopmgr);
+
+ isc_nmhandle_detach(&handle);
+ isc_refcount_decrement(&active_csends);
+}
+
static void
udp_shutdown_read_read_cb(isc_nmhandle_t *handle, isc_result_t eresult,
isc_region_t *region, void *cbarg) {
- UNUSED(handle);
UNUSED(region);
UNUSED(cbarg);
- assert_int_equal(eresult, ISC_R_SHUTTINGDOWN);
+ assert_true(eresult == ISC_R_SHUTTINGDOWN || eresult == ISC_R_TIMEDOUT);
isc_refcount_decrement(&active_creads);
udp_shutdown_read_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult,
void *cbarg) {
isc_nmhandle_t *readhandle = NULL;
-
- UNUSED(handle);
- UNUSED(cbarg);
+ isc_nmhandle_t *sendhandle = NULL;
isc_refcount_decrement(&active_cconnects);
assert_int_equal(eresult, ISC_R_SUCCESS);
+ /* Read */
isc_refcount_increment0(&active_creads);
isc_nmhandle_attach(handle, &readhandle);
isc_nm_read(handle, udp_shutdown_read_read_cb, cbarg);
- atomic_fetch_add(&cconnects, 1);
+ /* Send */
+ isc_refcount_increment0(&active_csends);
+ isc_nmhandle_attach(handle, &sendhandle);
+ isc_nmhandle_setwritetimeout(handle, T_IDLE);
+ isc_nm_send(sendhandle, (isc_region_t *)&send_msg,
+ udp_shutdown_read_send_cb, cbarg);
- isc_loopmgr_shutdown(loopmgr);
+ atomic_fetch_add(&cconnects, 1);
}
ISC_SETUP_TEST_IMPL(udp_shutdown_read) {
}
ISC_LOOP_TEST_IMPL(udp_shutdown_read) {
+ start_listening(ISC_NM_LISTEN_ONE, udp_shutdown_read_recv_cb);
+
isc_refcount_increment0(&active_cconnects);
isc_nm_udpconnect(netmgr, &udp_connect_addr, &udp_listen_addr,
udp_shutdown_read_connect_cb, NULL, T_SOFT);
udp_cancel_read_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult,
isc_region_t *region, void *cbarg) {
uint64_t magic = 0;
- isc_nmhandle_t *sendhandle = NULL;
+
+ UNUSED(cbarg);
assert_non_null(handle);
memmove(&magic, region->base, sizeof(magic));
assert_true(magic == send_magic);
+}
- isc_nmhandle_attach(handle, &sendhandle);
- isc_refcount_increment0(&active_ssends);
- isc_nmhandle_setwritetimeout(sendhandle, T_IDLE);
- isc_nm_send(sendhandle, (isc_region_t *)&send_msg, listen_send_cb,
- cbarg);
+static void
+udp_cancel_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult,
+ void *cbarg) {
+ UNUSED(cbarg);
+
+ F();
+
+ assert_non_null(handle);
+ assert_int_equal(eresult, ISC_R_SUCCESS);
+
+ atomic_fetch_add(&csends, 1);
+
+ isc_nm_cancelread(handle);
+
+ isc_nmhandle_detach(&handle);
+ isc_refcount_decrement(&active_csends);
}
static void
udp_cancel_read_read_cb(isc_nmhandle_t *handle, isc_result_t eresult,
isc_region_t *region, void *cbarg) {
- UNUSED(handle);
+ isc_nmhandle_t *sendhandle = NULL;
+ isc_nmhandle_t *readhandle = NULL;
+
UNUSED(region);
- UNUSED(cbarg);
F();
switch (eresult) {
case ISC_R_TIMEDOUT:
+
+ /* Read again */
+ isc_refcount_increment0(&active_creads);
+ isc_nmhandle_attach(handle, &readhandle);
+ isc_nm_read(handle, udp_cancel_read_read_cb, cbarg);
+
+ /* Send */
+ isc_refcount_increment0(&active_csends);
+ isc_nmhandle_attach(handle, &sendhandle);
+ isc_nmhandle_setwritetimeout(handle, T_IDLE);
+ isc_nm_send(sendhandle, (isc_region_t *)&send_msg,
+ udp_cancel_read_send_cb, cbarg);
+ break;
case ISC_R_EOF:
+ /* The read has been canceled */
+ isc_loopmgr_shutdown(loopmgr);
break;
default:
UNREACHABLE();
atomic_fetch_add(&creads, 1);
isc_nmhandle_detach(&handle);
-
- isc_loopmgr_shutdown(loopmgr);
-}
-
-static void
-udp_cancel_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult,
- void *cbarg) {
- UNUSED(cbarg);
-
- F();
-
- assert_non_null(handle);
- assert_int_equal(eresult, ISC_R_SUCCESS);
-
- atomic_fetch_add(&csends, 1);
-
- isc_nmhandle_detach(&handle);
- isc_refcount_decrement(&active_csends);
}
static void
udp_cancel_read_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult,
void *cbarg) {
isc_nmhandle_t *readhandle = NULL;
- isc_nmhandle_t *sendhandle = NULL;
-
- UNUSED(handle);
- UNUSED(cbarg);
isc_refcount_decrement(&active_cconnects);
isc_nmhandle_attach(handle, &readhandle);
isc_nm_read(handle, udp_cancel_read_read_cb, cbarg);
- /* Send */
- isc_refcount_increment0(&active_csends);
- isc_nmhandle_attach(handle, &sendhandle);
- isc_nmhandle_setwritetimeout(handle, T_IDLE);
- isc_nm_send(sendhandle, (isc_region_t *)&send_msg,
- udp_cancel_read_send_cb, readhandle);
-
- isc_nm_cancelread(readhandle);
-
atomic_fetch_add(&cconnects, 1);
}
ISC_SETUP_TEST_IMPL(udp_cancel_read) {
setup_test(state);
expected_cconnects = 1;
- expected_creads = 1;
+ expected_creads = 2;
return (0);
}
udp__send_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
isc_nmhandle_t *sendhandle = handle;
- UNUSED(cbarg);
-
assert_non_null(sendhandle);
F();
isc_nmhandle_t *readhandle = NULL;
isc_nmhandle_t *sendhandle = NULL;
- UNUSED(cbarg);
-
F();
isc_refcount_decrement(&active_cconnects);
static void
double_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) {
- UNUSED(cbarg);
- UNUSED(eresult);
-
assert_non_null(handle);
F();
uint64_t magic = 0;
bool detach = false;
- UNUSED(cbarg);
-
assert_non_null(handle);
F();