Optimize speed of switching to a handler thread.

This commit is contained in:
Xie Han
2025-08-09 19:17:39 +08:00
parent 2421bab699
commit 1ebcc00642
3 changed files with 33 additions and 8 deletions
+25 -1
View File
@@ -52,6 +52,24 @@ public:
}
};
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;
+7 -4
View File
@@ -219,21 +219,24 @@ public:
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);
+1 -3
View File
@@ -491,9 +491,7 @@ SubTask *WFComplexClientTask<REQ, RESP, CTX>::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