#include "track.h" using namespace NRainCheck; using namespace NRainCheck::NPrivate; void TTaskTrackerReceipt::SetDone() { TaskTracker->GetQueue()->EnqueueAndSchedule(this); } TString TTaskTrackerReceipt::GetStatusSingleLine() { return Task->GetStatusSingleLine(); } TTaskTracker::TTaskTracker(NActor::TExecutor* executor) : NActor::TActor(executor) { } TTaskTracker::~TTaskTracker() { Y_ASSERT(Tasks.Empty()); } void TTaskTracker::Shutdown() { ShutdownFlag.Set(true); Schedule(); ShutdownEvent.WaitI(); } void TTaskTracker::ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, ITaskFactory* taskFactory) { THolder holder(taskFactory); THolder receipt(new TTaskTrackerReceipt(this)); receipt->Task = taskFactory->NewTask(receipt.Get()); Tasks.PushBack(receipt.Release()); } void TTaskTracker::ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, TTaskTrackerReceipt* receipt) { Y_ASSERT(!receipt->Empty()); receipt->Unlink(); delete receipt; } void TTaskTracker::ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, TAsyncResult* status) { TTaskTrackerStatus s; s.Size = Tasks.Size(); status->SetResult(s); } void TTaskTracker::Act(NActor::TDefaultTag) { GetQueue*>()->DequeueAll(); GetQueue()->DequeueAll(); GetQueue()->DequeueAll(); if (ShutdownFlag.Get()) { if (Tasks.Empty()) { ShutdownEvent.Signal(); } } } ui32 TTaskTracker::Size() { TAsyncResult r; GetQueue*>()->EnqueueAndSchedule(&r); return r.GetResult().Size; }