diff --git a/src/ioevent_loop.c b/src/ioevent_loop.c index 1587cff..fa1deb4 100644 --- a/src/ioevent_loop.c +++ b/src/ioevent_loop.c @@ -324,3 +324,19 @@ int ioevent_set(struct fast_task_info *task, struct nio_thread_data *pThread, fast_timer_add(&pThread->timer, &task->event.timer); return 0; } + +int ioevent_reset(struct fast_task_info *task, int new_fd, short event) +{ + if (task->event.fd == new_fd) + { + return 0; + } + + if (task->event.fd >= 0) + { + ioevent_detach(&task->thread_data->ev_puller, task->event.fd); + } + + task->event.fd = new_fd; + return ioevent_attach(&task->thread_data->ev_puller, new_fd, event, task); +} diff --git a/src/ioevent_loop.h b/src/ioevent_loop.h index a12f33d..d59da7c 100644 --- a/src/ioevent_loop.h +++ b/src/ioevent_loop.h @@ -38,6 +38,8 @@ int ioevent_set(struct fast_task_info *task, struct nio_thread_data *pThread, int sock, short event, IOEventCallback callback, const int timeout, const bool use_iouring); +int ioevent_reset(struct fast_task_info *task, int new_fd, short event); + static inline bool ioevent_is_canceled(struct fast_task_info *task) { return __sync_fetch_and_add(&task->canceled, 0) != 0;