diff options
Diffstat (limited to 'library/cpp/messagebus/scheduler/scheduler.cpp')
-rw-r--r-- | library/cpp/messagebus/scheduler/scheduler.cpp | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/library/cpp/messagebus/scheduler/scheduler.cpp b/library/cpp/messagebus/scheduler/scheduler.cpp index 5c0686d32a..5a5fe52894 100644 --- a/library/cpp/messagebus/scheduler/scheduler.cpp +++ b/library/cpp/messagebus/scheduler/scheduler.cpp @@ -1,37 +1,37 @@ -#include "scheduler.h" - -#include <util/datetime/base.h> -#include <util/generic/algorithm.h> -#include <util/generic/yexception.h> - +#include "scheduler.h" + +#include <util/datetime/base.h> +#include <util/generic/algorithm.h> +#include <util/generic/yexception.h> + //#include "dummy_debugger.h" using namespace NBus; using namespace NBus::NPrivate; - -class TScheduleDeadlineCompare { -public: + +class TScheduleDeadlineCompare { +public: bool operator()(const IScheduleItemAutoPtr& i1, const IScheduleItemAutoPtr& i2) const noexcept { return i1->GetScheduleTime() > i2->GetScheduleTime(); - } -}; - -TScheduler::TScheduler() + } +}; + +TScheduler::TScheduler() : StopThread(false) , Thread([&] { this->SchedulerThread(); }) -{ -} - -TScheduler::~TScheduler() { +{ +} + +TScheduler::~TScheduler() { Y_VERIFY(StopThread, "state check"); -} - +} + size_t TScheduler::Size() const { TGuard<TLock> guard(Lock); return Items.size() + (!!NextItem ? 1 : 0); } -void TScheduler::Stop() { +void TScheduler::Stop() { { TGuard<TLock> guard(Lock); Y_VERIFY(!StopThread, "Scheduler already stopped"); @@ -46,28 +46,28 @@ void TScheduler::Stop() { for (auto& item : Items) { item.Destroy(); - } -} - -void TScheduler::Schedule(TAutoPtr<IScheduleItem> i) { + } +} + +void TScheduler::Schedule(TAutoPtr<IScheduleItem> i) { TGuard<TLock> lock(Lock); if (StopThread) - return; + return; if (!!NextItem) { if (i->GetScheduleTime() < NextItem->GetScheduleTime()) { DoSwap(i, NextItem); } - } + } - Items.push_back(i); + Items.push_back(i); PushHeap(Items.begin(), Items.end(), TScheduleDeadlineCompare()); FillNextItem(); CondVar.Signal(); -} - +} + void TScheduler::FillNextItem() { if (!NextItem && !Items.empty()) { PopHeap(Items.begin(), Items.end(), TScheduleDeadlineCompare()); @@ -76,22 +76,22 @@ void TScheduler::FillNextItem() { } } -void TScheduler::SchedulerThread() { +void TScheduler::SchedulerThread() { for (;;) { IScheduleItemAutoPtr current; - { + { TGuard<TLock> guard(Lock); if (StopThread) { break; - } + } if (!!NextItem) { CondVar.WaitD(Lock, NextItem->GetScheduleTime()); } else { CondVar.WaitI(Lock); - } + } if (StopThread) { break; @@ -106,7 +106,7 @@ void TScheduler::SchedulerThread() { } current = NextItem.Release(); - } + } current->Do(); current.Destroy(); @@ -115,5 +115,5 @@ void TScheduler::SchedulerThread() { TGuard<TLock> guard(Lock); FillNextItem(); } - } -} + } +} |