From 1ebcc0064276ebbd48d94be2827705c143b2f415 Mon Sep 17 00:00:00 2001 From: Xie Han <63350856@qq.com> Date: Sat, 9 Aug 2025 19:17:39 +0800 Subject: [PATCH 1/2] Optimize speed of switching to a handler thread. --- src/factory/WFTaskFactory.cc | 26 +++++++++++++++++++++++++- src/factory/WFTaskFactory.h | 11 +++++++---- src/factory/WFTaskFactory.inl | 4 +--- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/factory/WFTaskFactory.cc b/src/factory/WFTaskFactory.cc index ba72992093..115503695a 100644 --- a/src/factory/WFTaskFactory.cc +++ b/src/factory/WFTaskFactory.cc @@ -52,6 +52,24 @@ class __WFTimerTask : public WFTimerTask } }; +class __WFCanceledTimerTask : public __WFTimerTask +{ +protected: + virtual void dispatch() + { + if (this->scheduler->sleep(this) >= 0) + this->cancel(); + else + this->handle(WFT_STATE_SYS_ERROR, errno); + } + +public: + __WFCanceledTimerTask(CommScheduler *scheduler, timer_callback_t&& cb) : + __WFTimerTask(-1, 0, scheduler, std::move(cb)) + { + } +}; + WFTimerTask *WFTaskFactory::create_timer_task(time_t seconds, long nanoseconds, timer_callback_t callback) { @@ -59,6 +77,12 @@ WFTimerTask *WFTaskFactory::create_timer_task(time_t seconds, long nanoseconds, std::move(callback)); } +WFTimerTask *WFTaskFactory::create_timer_task(timer_callback_t callback) +{ + return new __WFCanceledTimerTask(WFGlobal::get_scheduler(), + std::move(callback)); +} + /* Deprecated. */ WFTimerTask *WFTaskFactory::create_timer_task(unsigned int microseconds, timer_callback_t callback) @@ -1096,7 +1120,7 @@ int WFTaskFactory::release_guard_safe(const std::string& name, void *msg) if (!node) return 0; - timer = WFTaskFactory::create_timer_task(0, 0, [node](WFTimerTask *timer) { + timer = WFTaskFactory::create_timer_task([node](WFTimerTask *timer) { node->guard->WFConditional::signal(timer->user_data); }); timer->user_data = msg; diff --git a/src/factory/WFTaskFactory.h b/src/factory/WFTaskFactory.h index 59f0a6df0c..7719b97d83 100644 --- a/src/factory/WFTaskFactory.h +++ b/src/factory/WFTaskFactory.h @@ -219,21 +219,24 @@ class WFTaskFactory static WFTimerTask *create_timer_task(time_t seconds, long nanoseconds, timer_callback_t callback); - /* create a named timer. */ + /* Create a named timer. */ static WFTimerTask *create_timer_task(const std::string& timer_name, time_t seconds, long nanoseconds, timer_callback_t callback); - /* cancel all timers under the name. */ + /* Cancel all timers under the name. */ static int cancel_by_name(const std::string& timer_name) { return WFTaskFactory::cancel_by_name(timer_name, (size_t)-1); } - /* cancel at most 'max' timers under the name. */ + /* Cancel at most 'max' timers under the name. */ static int cancel_by_name(const std::string& timer_name, size_t max); - /* timer in microseconds (deprecated) */ + /* Timer to be canceled immediately after started. */ + static WFTimerTask *create_timer_task(timer_callback_t callback); + + /* Timer in microseconds. (deprecated) */ static WFTimerTask *create_timer_task(unsigned int microseconds, timer_callback_t callback); diff --git a/src/factory/WFTaskFactory.inl b/src/factory/WFTaskFactory.inl index 44d230ce01..e015256c16 100644 --- a/src/factory/WFTaskFactory.inl +++ b/src/factory/WFTaskFactory.inl @@ -491,9 +491,7 @@ SubTask *WFComplexClientTask::done() auto&& cb = std::bind(&WFComplexClientTask::switch_callback, this, std::placeholders::_1); - WFTimerTask *timer; - - timer = WFTaskFactory::create_timer_task(0, 0, std::move(cb)); + WFTimerTask *timer = WFTaskFactory::create_timer_task(std::move(cb)); series->push_front(timer); } else From a95df2113ffa91aa5ef0aaf7a75879a65b8597ca Mon Sep 17 00:00:00 2001 From: Xie Han <63350856@qq.com> Date: Mon, 11 Aug 2025 21:56:01 +0800 Subject: [PATCH 2/2] Call 'callback' directly when deleting timers. --- src/kernel/poller.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/kernel/poller.c b/src/kernel/poller.c index 1900bd9a28..b2ffa65a76 100644 --- a/src/kernel/poller.c +++ b/src/kernel/poller.c @@ -1608,7 +1608,6 @@ int poller_add_timer(const struct timespec *value, void *context, void **timer, int poller_del_timer(void *timer, poller_t *poller) { struct __poller_node *node = (struct __poller_node *)timer; - int stopped = 0; pthread_mutex_lock(&poller->mutex); if (!node->removed) @@ -1622,9 +1621,6 @@ int poller_del_timer(void *timer, poller_t *poller) node->error = 0; node->state = PR_ST_DELETED; - stopped = poller->stopped; - if (!stopped) - write(poller->pipe_wr, &node, sizeof (void *)); } else { @@ -1633,7 +1629,7 @@ int poller_del_timer(void *timer, poller_t *poller) } pthread_mutex_unlock(&poller->mutex); - if (stopped) + if (node) poller->callback((struct poller_result *)node, poller->context); return -!node;