diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/poco/Foundation/include/Poco/TaskManager.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/TaskManager.h')
-rw-r--r-- | contrib/libs/poco/Foundation/include/Poco/TaskManager.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/TaskManager.h b/contrib/libs/poco/Foundation/include/Poco/TaskManager.h new file mode 100644 index 0000000000..3d6e7f1cc1 --- /dev/null +++ b/contrib/libs/poco/Foundation/include/Poco/TaskManager.h @@ -0,0 +1,137 @@ +// +// TaskManager.h +// +// Library: Foundation +// Package: Tasks +// Module: Tasks +// +// Definition of the TaskManager class. +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_TaskManager_INCLUDED +#define Foundation_TaskManager_INCLUDED + + +#include "Poco/Foundation.h" +#include "Poco/Mutex.h" +#include "Poco/Task.h" +#include "Poco/AutoPtr.h" +#include "Poco/NotificationCenter.h" +#include "Poco/Timestamp.h" +#include <list> + + +namespace Poco { + + +class Notification; +class ThreadPool; +class Exception; + + +class Foundation_API TaskManager + /// The TaskManager manages a collection of tasks + /// and monitors their lifetime. + /// + /// A TaskManager has a built-in NotificationCenter that + /// is used to send out notifications on task progress + /// and task states. See the TaskNotification class and its + /// subclasses for the various events that result in a notification. + /// To keep the number of notifications small, a TaskProgressNotification + /// will only be sent out once in 100 milliseconds. +{ +public: + typedef AutoPtr<Task> TaskPtr; + typedef std::list<TaskPtr> TaskList; + + TaskManager(); + /// Creates the TaskManager, using the + /// default ThreadPool. + + TaskManager(ThreadPool& pool); + /// Creates the TaskManager, using the + /// given ThreadPool. + + ~TaskManager(); + /// Destroys the TaskManager. + + void start(Task* pTask); + /// Starts the given task in a thread obtained + /// from the thread pool. + /// + /// The TaskManager takes ownership of the Task object + /// and deletes it when it it finished. + + void cancelAll(); + /// Requests cancellation of all tasks. + + void joinAll(); + /// Waits for the completion of all the threads + /// in the TaskManager's thread pool. + /// + /// Note: joinAll() will wait for ALL tasks in the + /// TaskManager's ThreadPool to complete. If the + /// ThreadPool has threads created by other + /// facilities, these threads must also complete + /// before joinAll() can return. + + TaskList taskList() const; + /// Returns a copy of the internal task list. + + int count() const; + /// Returns the number of tasks in the internal task list. + + void addObserver(const AbstractObserver& observer); + /// Registers an observer with the NotificationCenter. + /// Usage: + /// Observer<MyClass, MyNotification> obs(*this, &MyClass::handleNotification); + /// notificationCenter.addObserver(obs); + + void removeObserver(const AbstractObserver& observer); + /// Unregisters an observer with the NotificationCenter. + + static const int MIN_PROGRESS_NOTIFICATION_INTERVAL; + +protected: + void postNotification(const Notification::Ptr& pNf); + /// Posts a notification to the task manager's + /// notification center. + + void taskStarted(Task* pTask); + void taskProgress(Task* pTask, float progress); + void taskCancelled(Task* pTask); + void taskFinished(Task* pTask); + void taskFailed(Task* pTask, const Exception& exc); + +private: + ThreadPool& _threadPool; + TaskList _taskList; + Timestamp _lastProgressNotification; + NotificationCenter _nc; + mutable FastMutex _mutex; + + friend class Task; +}; + + +// +// inlines +// +inline int TaskManager::count() const +{ + FastMutex::ScopedLock lock(_mutex); + + return (int) _taskList.size(); +} + + +} // namespace Poco + + +#endif // Foundation_TaskManager_INCLUDED |