From 64d91092268a9515b24d4514a6ffdacb80a3002f Mon Sep 17 00:00:00 2001 From: ZehMatt Date: Tue, 24 Apr 2018 12:58:57 +0200 Subject: [PATCH] Add progress report back. --- src/openrct2/core/FileIndex.hpp | 6 +++++- src/openrct2/core/JobPool.hpp | 35 ++++++++++++++++++++++----------- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/openrct2/core/FileIndex.hpp b/src/openrct2/core/FileIndex.hpp index 049ed141bb..1ed4934460 100644 --- a/src/openrct2/core/FileIndex.hpp +++ b/src/openrct2/core/FileIndex.hpp @@ -242,7 +242,11 @@ private: std::ref(printLock))); } - jobPool.join(); + jobPool.join([&]() + { + size_t completed = totalCount - jobPool.countPending(); + Console::WriteFormat("File %5d of %d, done %3d%%\r", completed, totalCount, completed / totalCount); + }); for (auto&& itr : containers) { diff --git a/src/openrct2/core/JobPool.hpp b/src/openrct2/core/JobPool.hpp index bf6f47d723..bb1a511a7d 100644 --- a/src/openrct2/core/JobPool.hpp +++ b/src/openrct2/core/JobPool.hpp @@ -33,8 +33,8 @@ private: const std::function completionFn; }; - std::atomic_bool _shouldStop = false; - std::atomic _processing = 0; + std::atomic_bool _shouldStop; + std::atomic _processing; std::vector _threads; std::deque _pending; std::deque _completed; @@ -47,6 +47,8 @@ private: public: JobPool() { + _shouldStop = false; + _processing = 0; for (size_t n = 0; n < std::thread::hardware_concurrency(); n++) { _threads.emplace_back(&JobPool::processQueue, this); @@ -83,17 +85,21 @@ public: return addTask(workFn, nullptr); } - void join() + void join(std::function reportFn = nullptr) { while (true) { unique_lock lock(_mutex); _condComplete.wait(lock, [this]() { - return (_pending.empty() && _processing == 0) || - (_completed.empty() == false); + return (_pending.empty() && _processing == 0) || !_completed.empty(); }); + if (reportFn) + { + reportFn(); + } + if (_completed.empty() && _pending.empty() && _processing == 0) @@ -106,15 +112,23 @@ public: auto taskData = _completed.front(); _completed.pop_front(); - lock.unlock(); + if (taskData.completionFn) + { + lock.unlock(); - taskData.completionFn(); + taskData.completionFn(); - lock.lock(); + lock.lock(); + } } } } + size_t countPending() + { + return _pending.size(); + } + private: void processQueue() { @@ -137,10 +151,7 @@ private: lock.lock(); - if (taskData.completionFn) - { - _completed.push_back(taskData); - } + _completed.push_back(taskData); _processing--; _condComplete.notify_one();