Skip to content

Commit f46f02c

Browse files
authored
Merge pull request sogou#1770 from Barenboim/master
Optimize speed of switching to a handler thread.
2 parents 2421bab + a95df21 commit f46f02c

4 files changed

Lines changed: 34 additions & 13 deletions

File tree

src/factory/WFTaskFactory.cc

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,37 @@ class __WFTimerTask : public WFTimerTask
5252
}
5353
};
5454

55+
class __WFCanceledTimerTask : public __WFTimerTask
56+
{
57+
protected:
58+
virtual void dispatch()
59+
{
60+
if (this->scheduler->sleep(this) >= 0)
61+
this->cancel();
62+
else
63+
this->handle(WFT_STATE_SYS_ERROR, errno);
64+
}
65+
66+
public:
67+
__WFCanceledTimerTask(CommScheduler *scheduler, timer_callback_t&& cb) :
68+
__WFTimerTask(-1, 0, scheduler, std::move(cb))
69+
{
70+
}
71+
};
72+
5573
WFTimerTask *WFTaskFactory::create_timer_task(time_t seconds, long nanoseconds,
5674
timer_callback_t callback)
5775
{
5876
return new __WFTimerTask(seconds, nanoseconds, WFGlobal::get_scheduler(),
5977
std::move(callback));
6078
}
6179

80+
WFTimerTask *WFTaskFactory::create_timer_task(timer_callback_t callback)
81+
{
82+
return new __WFCanceledTimerTask(WFGlobal::get_scheduler(),
83+
std::move(callback));
84+
}
85+
6286
/* Deprecated. */
6387
WFTimerTask *WFTaskFactory::create_timer_task(unsigned int microseconds,
6488
timer_callback_t callback)
@@ -1096,7 +1120,7 @@ int WFTaskFactory::release_guard_safe(const std::string& name, void *msg)
10961120
if (!node)
10971121
return 0;
10981122

1099-
timer = WFTaskFactory::create_timer_task(0, 0, [node](WFTimerTask *timer) {
1123+
timer = WFTaskFactory::create_timer_task([node](WFTimerTask *timer) {
11001124
node->guard->WFConditional::signal(timer->user_data);
11011125
});
11021126
timer->user_data = msg;

src/factory/WFTaskFactory.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,21 +219,24 @@ class WFTaskFactory
219219
static WFTimerTask *create_timer_task(time_t seconds, long nanoseconds,
220220
timer_callback_t callback);
221221

222-
/* create a named timer. */
222+
/* Create a named timer. */
223223
static WFTimerTask *create_timer_task(const std::string& timer_name,
224224
time_t seconds, long nanoseconds,
225225
timer_callback_t callback);
226226

227-
/* cancel all timers under the name. */
227+
/* Cancel all timers under the name. */
228228
static int cancel_by_name(const std::string& timer_name)
229229
{
230230
return WFTaskFactory::cancel_by_name(timer_name, (size_t)-1);
231231
}
232232

233-
/* cancel at most 'max' timers under the name. */
233+
/* Cancel at most 'max' timers under the name. */
234234
static int cancel_by_name(const std::string& timer_name, size_t max);
235235

236-
/* timer in microseconds (deprecated) */
236+
/* Timer to be canceled immediately after started. */
237+
static WFTimerTask *create_timer_task(timer_callback_t callback);
238+
239+
/* Timer in microseconds. (deprecated) */
237240
static WFTimerTask *create_timer_task(unsigned int microseconds,
238241
timer_callback_t callback);
239242

src/factory/WFTaskFactory.inl

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -491,9 +491,7 @@ SubTask *WFComplexClientTask<REQ, RESP, CTX>::done()
491491
auto&& cb = std::bind(&WFComplexClientTask::switch_callback,
492492
this,
493493
std::placeholders::_1);
494-
WFTimerTask *timer;
495-
496-
timer = WFTaskFactory::create_timer_task(0, 0, std::move(cb));
494+
WFTimerTask *timer = WFTaskFactory::create_timer_task(std::move(cb));
497495
series->push_front(timer);
498496
}
499497
else

src/kernel/poller.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,6 @@ int poller_add_timer(const struct timespec *value, void *context, void **timer,
16081608
int poller_del_timer(void *timer, poller_t *poller)
16091609
{
16101610
struct __poller_node *node = (struct __poller_node *)timer;
1611-
int stopped = 0;
16121611

16131612
pthread_mutex_lock(&poller->mutex);
16141613
if (!node->removed)
@@ -1622,9 +1621,6 @@ int poller_del_timer(void *timer, poller_t *poller)
16221621

16231622
node->error = 0;
16241623
node->state = PR_ST_DELETED;
1625-
stopped = poller->stopped;
1626-
if (!stopped)
1627-
write(poller->pipe_wr, &node, sizeof (void *));
16281624
}
16291625
else
16301626
{
@@ -1633,7 +1629,7 @@ int poller_del_timer(void *timer, poller_t *poller)
16331629
}
16341630

16351631
pthread_mutex_unlock(&poller->mutex);
1636-
if (stopped)
1632+
if (node)
16371633
poller->callback((struct poller_result *)node, poller->context);
16381634

16391635
return -!node;

0 commit comments

Comments
 (0)