diff --git a/lib/isc/include/isc/socket.h b/lib/isc/include/isc/socket.h index 98fa51bfd6..dcb7c48ac1 100644 --- a/lib/isc/include/isc/socket.h +++ b/lib/isc/include/isc/socket.h @@ -1038,6 +1038,12 @@ isc_socketmgr_renderjson(isc_socketmgr_t *mgr, json_object *stats); typedef isc_result_t (*isc_socketmgrcreatefunc_t)(isc_mem_t *mctx, isc_socketmgr_t **managerp); +typedef isc_result_t +(*isc_socketevent_factory_t)(void* arg, isc_socketevent_t **ret); + +isc_result_t +isc_socket_udpsubscribe(isc_socket_t *sock, isc_socketevent_factory_t evf, void* arg); + ISC_LANG_ENDDECLS #endif /* ISC_SOCKET_H */ diff --git a/lib/isc/unix/socket.c b/lib/isc/unix/socket.c index 98e2c28b82..49575d0b3c 100644 --- a/lib/isc/unix/socket.c +++ b/lib/isc/unix/socket.c @@ -3136,6 +3136,15 @@ internal_recv(isc__socket_t *sock) { LOCK(&sock->lock); dev = sock->recv_event; + if (dev == NULL && sock->recv_subscriber != NULL) { + result = sock->recv_subscriber(sock->recv_subscriber_arg, + &sock->recv_event); + if (result == ISC_R_QUOTA) { + // Unsubscribe + sock->recv_subscriber = NULL; + } + } + dev = sock->recv_event; if (dev == NULL) { goto finish; } @@ -3144,10 +3153,6 @@ internal_recv(isc__socket_t *sock) { isc_msgcat, ISC_MSGSET_SOCKET, ISC_MSG_INTERNALRECV, "internal_recv: event %p -> task %p", dev, dev->ev_sender); - /* - * Try to do as much I/O as possible on this socket. There are no - * limits here, currently. - */ result = doio_recv(sock, dev); if (result == DOIO_EOF) { dev->result = ISC_R_EOF; @@ -3157,7 +3162,7 @@ internal_recv(isc__socket_t *sock) { } finish: - if (sock->recv_event == NULL) { + if (sock->recv_event == NULL && sock->recv_subscriber == NULL) { unwatch_fd(&sock->manager->threads[sock->threadid], sock->fd, SELECT_POKE_READ); }