4 #include "util/asio/periodic_task.h" 6 #include "base/logging.h" 7 #include "util/asio/yield.h" 8 #include "util/stats/varz_stats.h" 13 DEFINE_VARZ(VarzCount, task_hang_times);
15 void PeriodicTask::Cancel() {
16 if ((state_ & ALARMED) == 0)
20 timer_.expires_after(duration_t(0));
22 while (state_ & ALARMED) {
23 timer_.async_wait(fibers_ext::yield[ec]);
25 state_ &= ~uint8_t(SHUTDOWN);
26 VLOG(1) <<
"Cancel Finish";
29 void PeriodicTask::Alarm() {
30 CHECK_EQ(0, state_ & ALARMED) <<
"Can not Start on already alarmed timer, run Cancel first";
31 last_ = timer_t::clock_type::now();
32 timer_.expires_at(last_ + d_);
36 void PeriodicWorkerTask::ResetErrorState() {
38 task_hang_times.IncBy(-1);
45 void PeriodicWorkerTask::Epilog() {
48 std::lock_guard<::boost::fibers::mutex> lock(m_);
49 is_running_.store(
false);
53 void PeriodicWorkerTask::HandleSkipRun() {
55 if (!is_hanging_ && number_skips_ > opts_.skip_run_margin) {
57 task_hang_times.Inc();
60 LOG(ERROR) <<
"Task " << opts_.name <<
" hands for " << number_skips_ <<
" times";
64 void PeriodicWorkerTask::Cancel() {
67 std::unique_lock<::boost::fibers::mutex> lock(m_);
68 cond_.wait(lock, [
this]() {
return !is_running_; });
71 VLOG(1) <<
"PeriodicWorkerTask::Cancel end";