Merge pull request #1770 from Barenboim/master

Optimize speed of switching to a handler thread.
This commit is contained in:
xiehan
2025-08-11 22:34:24 +08:00
committed by GitHub
4 changed files with 34 additions and 13 deletions

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;

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);

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

View File

@@ -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;