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:
Esteban Papp
2022-01-06 16:04:46 -08:00
parent ff6f6689a1
commit 223baa7e45
3 changed files with 0 additions and 201 deletions
@@ -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