diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 6ed34baa..182bed6f 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -272,15 +272,15 @@ public: LoaderWorker(AssetsLoader* loader) : loader(loader) { } - assetload::postfunc operator()(const std::shared_ptr& entry + assetload::postfunc operator()(const aloader_entry& entry ) override { - aloader_func loadfunc = loader->getLoader(entry->tag); + aloader_func loadfunc = loader->getLoader(entry.tag); return loadfunc( loader, loader->getPaths(), - entry->filename, - entry->alias, - entry->config + entry.filename, + entry.alias, + entry.config ); } }; @@ -290,14 +290,13 @@ std::shared_ptr AssetsLoader::startTask(runnable onDone) { std::make_shared>( "assets-loader-pool", [=]() { return std::make_shared(this); }, - [=](assetload::postfunc& func) { func(assets); } + [=](const assetload::postfunc& func) { func(assets); } ); pool->setOnComplete(std::move(onDone)); while (!entries.empty()) { - const aloader_entry& entry = entries.front(); - auto ptr = std::make_shared(entry); - pool->enqueueJob(ptr); + aloader_entry entry = std::move(entries.front()); entries.pop(); + pool->enqueueJob(std::move(entry)); } return pool; } diff --git a/src/assets/AssetsLoader.hpp b/src/assets/AssetsLoader.hpp index 602d841a..2321f9a3 100644 --- a/src/assets/AssetsLoader.hpp +++ b/src/assets/AssetsLoader.hpp @@ -43,8 +43,8 @@ using aloader_func = std::function< struct aloader_entry { AssetType tag; - const std::string filename; - const std::string alias; + std::string filename; + std::string alias; std::shared_ptr config; }; diff --git a/src/files/WorldConverter.cpp b/src/files/WorldConverter.cpp index 46b85868..f9484142 100644 --- a/src/files/WorldConverter.cpp +++ b/src/files/WorldConverter.cpp @@ -27,8 +27,8 @@ public: : converter(std::move(converter)) { } - int operator()(const std::shared_ptr& task) override { - converter->convert(*task); + int operator()(const ConvertTask& task) override { + converter->convert(task); return 0; } }; @@ -169,10 +169,10 @@ std::shared_ptr WorldConverter::startTask( ); auto& converterTasks = converter->tasks; while (!converterTasks.empty()) { - const ConvertTask& task = converterTasks.front(); - auto ptr = std::make_shared(task); - pool->enqueueJob(ptr); + ConvertTask task = std::move(converterTasks.front()); converterTasks.pop(); + pool->enqueueJob(std::move(task)); + } pool->setOnComplete([=]() { converter->write(); diff --git a/src/graphics/render/ChunksRenderer.cpp b/src/graphics/render/ChunksRenderer.cpp index 0cfd327d..f5fb7f89 100644 --- a/src/graphics/render/ChunksRenderer.cpp +++ b/src/graphics/render/ChunksRenderer.cpp @@ -12,7 +12,7 @@ static debug::Logger logger("chunks-render"); -class RendererWorker : public util::Worker { +class RendererWorker : public util::Worker, RendererResult> { Level* level; BlocksRenderer renderer; public: diff --git a/src/graphics/render/ChunksRenderer.hpp b/src/graphics/render/ChunksRenderer.hpp index da02ad0e..62d07280 100644 --- a/src/graphics/render/ChunksRenderer.hpp +++ b/src/graphics/render/ChunksRenderer.hpp @@ -30,7 +30,7 @@ class ChunksRenderer { std::unordered_map> meshes; std::unordered_map inwork; - util::ThreadPool threadPool; + util::ThreadPool, RendererResult> threadPool; public: ChunksRenderer( Level* level, diff --git a/src/util/ThreadPool.hpp b/src/util/ThreadPool.hpp index 3bc7f86e..98ebcce5 100644 --- a/src/util/ThreadPool.hpp +++ b/src/util/ThreadPool.hpp @@ -17,7 +17,7 @@ namespace util { template struct ThreadPoolResult { - std::shared_ptr job; + J job; std::condition_variable& variable; int workerIndex; bool& locked; @@ -29,13 +29,13 @@ namespace util { public: Worker() = default; virtual ~Worker() = default; - virtual R operator()(const std::shared_ptr&) = 0; + virtual R operator()(const T&) = 0; }; template class ThreadPool : public Task { debug::Logger logger; - std::queue> jobs; + std::queue jobs; std::queue> results; std::mutex resultsMutex; std::vector threads; @@ -43,7 +43,7 @@ namespace util { std::mutex jobsMutex; std::vector> workersBlocked; consumer resultConsumer; - consumer&> onJobFailed = nullptr; + consumer onJobFailed = nullptr; runnable onComplete = nullptr; std::atomic busyWorkers = 0; std::atomic jobsDone = 0; @@ -57,7 +57,7 @@ namespace util { std::mutex mutex; bool locked = false; while (working) { - std::shared_ptr job; + T job; { std::unique_lock lock(jobsMutex); jobsMutexCondition.wait(lock, [this] { @@ -66,7 +66,7 @@ namespace util { if (!working || failed) { break; } - job = jobs.front(); + job = std::move(jobs.front()); jobs.pop(); busyWorkers++; @@ -229,10 +229,10 @@ namespace util { } } - void enqueueJob(const std::shared_ptr& job) { + void enqueueJob(T job) { { std::lock_guard lock(jobsMutex); - jobs.push(job); + jobs.push(std::move(job)); } jobsMutexCondition.notify_one(); }