diff --git a/code/Editor/Pipeline/PipelineDependsParallel.cpp b/code/Editor/Pipeline/PipelineDependsParallel.cpp index c78372241..d21ab0f16 100644 --- a/code/Editor/Pipeline/PipelineDependsParallel.cpp +++ b/code/Editor/Pipeline/PipelineDependsParallel.cpp @@ -107,7 +107,10 @@ void PipelineDependsParallel::addDependency(const ISerializable* sourceAsset, co jobAddDependency(parentDependency, sourceAssetRef, outputPath, outputGuid, flags); }); if (job) - m_jobs.put(job); + { + T_ANONYMOUS_VAR(Acquire< Semaphore >)(m_jobsLock); + m_jobs.push_back(job); + } else m_result = false; } @@ -127,7 +130,10 @@ void PipelineDependsParallel::addDependency(db::Instance* sourceAssetInstance, u jobAddDependency(parentDependency, sourceAssetInstanceRef, flags); }); if (job) - m_jobs.put(job); + { + T_ANONYMOUS_VAR(Acquire< Semaphore >)(m_jobsLock); + m_jobs.push_back(job); + } else m_result = false; } @@ -146,7 +152,10 @@ void PipelineDependsParallel::addDependency(const Guid& sourceAssetGuid, uint32_ jobAddDependency(parentDependency, sourceAssetGuid, flags); }); if (job) - m_jobs.put(job); + { + T_ANONYMOUS_VAR(Acquire< Semaphore >)(m_jobsLock); + m_jobs.push_back(job); + } else m_result = false; } @@ -212,8 +221,13 @@ bool PipelineDependsParallel::waitUntilFinished() Ref< Job > job; for (;;) { - if (!m_jobs.get(job)) - break; + { + T_ANONYMOUS_VAR(Acquire< Semaphore >)(m_jobsLock); + if (m_jobs.empty()) + break; + job = m_jobs.front(); + m_jobs.pop_front(); + } job->wait(); } return m_result; diff --git a/code/Editor/Pipeline/PipelineDependsParallel.h b/code/Editor/Pipeline/PipelineDependsParallel.h index 43d2131e5..a7afb8710 100644 --- a/code/Editor/Pipeline/PipelineDependsParallel.h +++ b/code/Editor/Pipeline/PipelineDependsParallel.h @@ -1,6 +1,6 @@ /* * TRAKTOR - * Copyright (c) 2022 Anders Pistol. + * Copyright (c) 2022-2024 Anders Pistol. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,7 +8,7 @@ */ #pragma once -#include "Core/Containers/ThreadsafeFifo.h" +#include "Core/RefArray.h" #include "Core/Thread/ReaderWriterLock.h" #include "Core/Thread/Semaphore.h" #include "Core/Thread/ThreadLocal.h" @@ -93,7 +93,7 @@ class T_DLLCLASS PipelineDependsParallel : public IPipelineDepends virtual Ref< const ISerializable > getObjectReadOnly(const Guid& instanceGuid) override final; private: - ThreadsafeFifo< Ref< Job > > m_jobs; + RefArray< Job > m_jobs; Ref< PipelineFactory > m_pipelineFactory; Ref< db::Database > m_sourceDatabase; Ref< db::Database > m_outputDatabase; @@ -102,6 +102,7 @@ class T_DLLCLASS PipelineDependsParallel : public IPipelineDepends Ref< IPipelineInstanceCache > m_instanceCache; ThreadLocal m_currentDependency; ReaderWriterLock m_readCacheLock; + Semaphore m_jobsLock; Semaphore m_dependencySetLock; mutable bool m_result;