#pragma once #include "spawn.h" #include "task.h" #include #include #include #include #include namespace NRainCheck { class TTaskTracker; namespace NPrivate { struct ITaskFactory { virtual TIntrusivePtr NewTask(ISubtaskListener*) = 0; virtual ~ITaskFactory() { } }; struct TTaskTrackerReceipt: public ISubtaskListener, public TIntrusiveListItem { TTaskTracker* const TaskTracker; TIntrusivePtr Task; TTaskTrackerReceipt(TTaskTracker* taskTracker) : TaskTracker(taskTracker) { } void SetDone() override; TString GetStatusSingleLine(); }; struct TTaskTrackerStatus { ui32 Size; }; } class TTaskTracker : public TAtomicRefCount, public NActor::TActor, public NActor::TQueueInActor, public NActor::TQueueInActor, public NActor::TQueueInActor*> { friend struct NPrivate::TTaskTrackerReceipt; private: TAtomicBox ShutdownFlag; TSystemEvent ShutdownEvent; TIntrusiveList Tasks; template NActor::TQueueInActor* GetQueue() { return this; } public: TTaskTracker(NActor::TExecutor* executor); ~TTaskTracker() override; void Shutdown(); void ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, NPrivate::ITaskFactory*); void ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, NPrivate::TTaskTrackerReceipt*); void ProcessItem(NActor::TDefaultTag, NActor::TDefaultTag, TAsyncResult*); void Act(NActor::TDefaultTag); template void Spawn(TEnv* env, TParam param) { struct TTaskFactory: public NPrivate::ITaskFactory { TEnv* const Env; TParam Param; TTaskFactory(TEnv* env, TParam param) : Env(env) , Param(param) { } TIntrusivePtr NewTask(ISubtaskListener* subtaskListener) override { return NRainCheck::SpawnTask(Env, Param, subtaskListener).Get(); } }; GetQueue()->EnqueueAndSchedule(new TTaskFactory(env, param)); } ui32 Size(); }; }