Removes ProducerConsumerQueue.h and ConcurrentQueue.h from Gems/Vegetation
Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>
This commit is contained in:
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/parallel/mutex.h>
|
||||
#include <AzCore/std/parallel/lock.h>
|
||||
#include <AzCore/std/containers/list.h>
|
||||
|
||||
namespace Vegetation
|
||||
{
|
||||
/**
|
||||
* Manages a light weight producer consumer storage container
|
||||
*/
|
||||
template <typename TItem, typename QueueType = AZStd::list<TItem>>
|
||||
class ConcurrentQueue final
|
||||
{
|
||||
public:
|
||||
AZ_INLINE QueueType& ClaimQueue()
|
||||
{
|
||||
int lastQueue = Flip();
|
||||
return m_queueData[lastQueue];
|
||||
}
|
||||
|
||||
AZ_INLINE QueueType& ClaimQueueNoSort()
|
||||
{
|
||||
int lastQueue = FlipNoSort();
|
||||
return m_queueData[lastQueue];
|
||||
}
|
||||
|
||||
AZ_INLINE bool IsCurrentEmpty() const
|
||||
{
|
||||
return m_queueData[m_currentQueueIndex].empty();
|
||||
}
|
||||
|
||||
AZ_INLINE void EmplaceBack(TItem item)
|
||||
{
|
||||
m_queueData[m_currentQueueIndex].emplace_back(AZStd::move(item));
|
||||
}
|
||||
|
||||
AZ_INLINE void CopyBack(TItem item)
|
||||
{
|
||||
m_queueData[m_currentQueueIndex].push_back(item);
|
||||
}
|
||||
|
||||
AZ_INLINE void Insert(TItem item)
|
||||
{
|
||||
m_queueData[m_currentQueueIndex].insert(item);
|
||||
}
|
||||
|
||||
protected:
|
||||
AZ_INLINE int Flip()
|
||||
{
|
||||
// get rid of possible duplicates
|
||||
int processIndex = FlipNoSort();
|
||||
m_queueData[processIndex].sort();
|
||||
m_queueData[processIndex].unique();
|
||||
return processIndex;
|
||||
}
|
||||
|
||||
AZ_INLINE int FlipNoSort()
|
||||
{
|
||||
int processIndex = m_currentQueueIndex;
|
||||
{
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_queueMutex);
|
||||
m_currentQueueIndex = 1 - m_currentQueueIndex;
|
||||
}
|
||||
return processIndex;
|
||||
}
|
||||
|
||||
private:
|
||||
QueueType m_queueData[2];
|
||||
AZStd::atomic_int m_currentQueueIndex{0};
|
||||
AZStd::recursive_mutex m_queueMutex;
|
||||
};
|
||||
}
|
||||
@@ -1,119 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) Contributors to the Open 3D Engine Project.
|
||||
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/std/parallel/mutex.h>
|
||||
#include <AzCore/std/parallel/lock.h>
|
||||
#include <AzCore/std/containers/list.h>
|
||||
#include <AzCore/std/containers/deque.h>
|
||||
#include "ConcurrentQueue.h"
|
||||
|
||||
namespace Vegetation
|
||||
{
|
||||
/**
|
||||
* A simple producer-consumer class to handle dual-threaded working queues
|
||||
*/
|
||||
template <typename TItem, typename ProducerQueueType = ConcurrentQueue<TItem>, typename ConsumerQueueType = AZStd::list<TItem>>
|
||||
class ProducerConsumerQueue final
|
||||
{
|
||||
public:
|
||||
AZ_INLINE void EmplaceBack(TItem item)
|
||||
{
|
||||
m_producerQueue.EmplaceBack(AZStd::move(item));
|
||||
}
|
||||
|
||||
AZ_INLINE void CopyBack(TItem item)
|
||||
{
|
||||
m_producerQueue.CopyBack(item);
|
||||
}
|
||||
|
||||
AZ_INLINE bool IsEmpty() const
|
||||
{
|
||||
if (m_producerQueue.IsCurrentEmpty())
|
||||
{
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_consumerQueueMutex);
|
||||
return m_consumerQueue.empty();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
using ItemFunc = AZStd::function<bool(TItem&)>;
|
||||
using ContinueFunc = AZStd::function<bool()>;
|
||||
|
||||
// on ItemFunc return TRUE, remove from consumer queue
|
||||
AZ_INLINE void Consume(ItemFunc consumeItemFunc, ContinueFunc continueFunc)
|
||||
{
|
||||
if (CanConsume())
|
||||
{
|
||||
PrepareConsumer();
|
||||
}
|
||||
|
||||
// attempt to consume the items
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_consumerQueueMutex);
|
||||
auto itItem = m_consumerQueue.begin();
|
||||
while (itItem != m_consumerQueue.end())
|
||||
{
|
||||
if (consumeItemFunc(*itItem))
|
||||
{
|
||||
itItem = m_consumerQueue.erase(itItem);
|
||||
}
|
||||
else
|
||||
{
|
||||
++itItem;
|
||||
}
|
||||
if (!continueFunc())
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// on ItemFunc return TRUE, stop processing
|
||||
AZ_INLINE void Process(ItemFunc processItemFunc)
|
||||
{
|
||||
if (CanConsume())
|
||||
{
|
||||
PrepareConsumer();
|
||||
}
|
||||
|
||||
// process the locked queue
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_consumerQueueMutex);
|
||||
auto itItem = m_consumerQueue.begin();
|
||||
while (itItem != m_consumerQueue.end())
|
||||
{
|
||||
if (processItemFunc(*itItem))
|
||||
{
|
||||
break;
|
||||
}
|
||||
++itItem;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
AZ_INLINE bool CanConsume() const
|
||||
{
|
||||
return !m_producerQueue.IsCurrentEmpty();
|
||||
}
|
||||
|
||||
AZ_INLINE void PrepareConsumer()
|
||||
{
|
||||
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_consumerQueueMutex);
|
||||
auto& itemList = m_producerQueue.ClaimQueueNoSort();
|
||||
while (!itemList.empty())
|
||||
{
|
||||
m_consumerQueue.emplace_back(AZStd::move(itemList.back()));
|
||||
itemList.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
ProducerQueueType m_producerQueue;
|
||||
ConsumerQueueType m_consumerQueue;
|
||||
mutable AZStd::recursive_mutex m_consumerQueueMutex;
|
||||
};
|
||||
}
|
||||
@@ -87,8 +87,6 @@ set(FILES
|
||||
Source/Components/SurfaceMaskFilterComponent.h
|
||||
Source/Components/SurfaceSlopeFilterComponent.cpp
|
||||
Source/Components/SurfaceSlopeFilterComponent.h
|
||||
Source/Util/ConcurrentQueue.h
|
||||
Source/Util/ProducerConsumerQueue.h
|
||||
Source/Debugger/AreaDebugComponent.cpp
|
||||
Source/Debugger/AreaDebugComponent.h
|
||||
Source/Debugger/DebugComponent.cpp
|
||||
|
||||
Reference in New Issue
Block a user