};
typedef enum isc__netievent_type {
- netievent_udpcancel,
-
netievent_tcpaccept,
netievent_tlsclose,
* Set or clear the recv timeout for the UDP socket associated with 'handle'.
*/
-void
-isc__nm_async_udpcancel(isc__networker_t *worker, isc__netievent_t *ev0);
-/*%<
- * Callback handlers for asynchronous UDP events (listen, stoplisten, send).
- */
-
void
isc__nm_tcp_send(isc_nmhandle_t *handle, const isc_region_t *region,
isc_nm_cb_t cb, void *cbarg);
NETIEVENT_SOCKET_REQ_RESULT_TYPE(sendcb);
-NETIEVENT_SOCKET_HANDLE_TYPE(udpcancel);
-
NETIEVENT_SOCKET_QUOTA_TYPE(tcpaccept);
NETIEVENT_SOCKET_TYPE(streamdnsread);
NETIEVENT_SOCKET_REQ_RESULT_DECL(sendcb);
-NETIEVENT_SOCKET_HANDLE_DECL(udpcancel);
-
NETIEVENT_SOCKET_QUOTA_DECL(tcpaccept);
NETIEVENT_SOCKET_DECL(streamdnsread);
isc__networker_t *worker = ievent->worker;
switch (ievent->type) {
- NETIEVENT_CASE(udpcancel);
-
NETIEVENT_CASE(tcpaccept);
NETIEVENT_CASE(tlssend);
NETIEVENT_SOCKET_DEF(tlsclose);
NETIEVENT_SOCKET_DEF(tlsconnect);
NETIEVENT_SOCKET_DEF(tlsdobio);
-NETIEVENT_SOCKET_HANDLE_DEF(udpcancel);
#ifdef HAVE_LIBNGHTTP2
NETIEVENT_SOCKET_REQ_DEF(httpsend);
isc__nmsocket_prep_destroy(sock);
}
-void
-isc__nm_udp_cancelread(isc_nmhandle_t *handle) {
- isc_nmsocket_t *sock = NULL;
- isc__netievent_udpcancel_t *ievent = NULL;
-
- REQUIRE(VALID_NMHANDLE(handle));
-
- sock = handle->sock;
+static void
+udp_cancelread_cb(void *arg) {
+ isc_nmsocket_t *sock = arg;
REQUIRE(VALID_NMSOCK(sock));
- REQUIRE(sock->type == isc_nm_udpsocket);
-
- ievent = isc__nm_get_netievent_udpcancel(sock->worker, sock, handle);
+ REQUIRE(sock->tid == isc_tid());
+ REQUIRE(atomic_load(&sock->client));
- isc__nm_enqueue_ievent(sock->worker, (isc__netievent_t *)ievent);
+ isc__nm_failed_read_cb(sock, ISC_R_EOF, false);
+ isc__nmsocket_detach(&sock);
}
void
-isc__nm_async_udpcancel(isc__networker_t *worker, isc__netievent_t *ev0) {
- isc__netievent_udpcancel_t *ievent = (isc__netievent_udpcancel_t *)ev0;
- isc_nmsocket_t *sock = NULL;
-
- UNUSED(worker);
-
- REQUIRE(VALID_NMSOCK(ievent->sock));
+isc__nm_udp_cancelread(isc_nmhandle_t *handle) {
+ REQUIRE(VALID_NMHANDLE(handle));
- sock = ievent->sock;
+ isc_nmsocket_t *sock = handle->sock;
- REQUIRE(sock->tid == isc_tid());
- REQUIRE(atomic_load(&sock->client));
+ REQUIRE(VALID_NMSOCK(sock));
+ REQUIRE(sock->type == isc_nm_udpsocket);
- isc__nm_failed_read_cb(sock, ISC_R_EOF, false);
+ isc__nmsocket_attach(sock, &(isc_nmsocket_t *){ NULL });
+ isc_async_run(sock->worker->loop, udp_cancelread_cb, sock);
}