| Index: src/IceThreading.h
|
| diff --git a/src/IceThreading.h b/src/IceThreading.h
|
| index ecc350e0d5cd31ebe486bafec6d5ffe9c4962242..40ada47c1622d4780cfe7fd3b5b5f83301795910 100644
|
| --- a/src/IceThreading.h
|
| +++ b/src/IceThreading.h
|
| @@ -18,7 +18,9 @@
|
| #include "IceDefs.h"
|
|
|
| #include <condition_variable>
|
| +#include <memory>
|
| #include <mutex>
|
| +#include <utility>
|
|
|
| namespace Ice {
|
|
|
| @@ -55,18 +57,18 @@ class BoundedProducerConsumerQueue {
|
| public:
|
| BoundedProducerConsumerQueue(bool Sequential, size_t MaxSize = MaxStaticSize)
|
| : MaxSize(std::min(MaxSize, MaxStaticSize)), Sequential(Sequential) {}
|
| - void blockingPush(T *Item) {
|
| + void blockingPush(std::unique_ptr<T> Item) {
|
| {
|
| std::unique_lock<GlobalLockType> L(Lock);
|
| // If the work queue is already "full", wait for a consumer to grab an
|
| // element and shrink the queue.
|
| Shrunk.wait(L, [this] { return size() < MaxSize || Sequential; });
|
| - push(Item);
|
| + push(std::move(Item));
|
| }
|
| GrewOrEnded.notify_one();
|
| }
|
| - T *blockingPop() {
|
| - T *Item = nullptr;
|
| + std::unique_ptr<T> blockingPop() {
|
| + std::unique_ptr<T> Item;
|
| bool ShouldNotifyProducer = false;
|
| {
|
| std::unique_lock<GlobalLockType> L(Lock);
|
| @@ -95,7 +97,7 @@ private:
|
|
|
| ICE_CACHELINE_BOUNDARY;
|
| /// WorkItems and Lock are read/written by all.
|
| - T *WorkItems[MaxStaticSize];
|
| + std::unique_ptr<T> WorkItems[MaxStaticSize];
|
| ICE_CACHELINE_BOUNDARY;
|
| /// Lock guards access to WorkItems, Front, Back, and IsEnded.
|
| GlobalLockType Lock;
|
| @@ -131,13 +133,13 @@ private:
|
| /// The lock must be held when the following methods are called.
|
| bool empty() const { return Front == Back; }
|
| size_t size() const { return Back - Front; }
|
| - void push(T *Item) {
|
| - WorkItems[Back++ & MaxStaticSizeMask] = Item;
|
| + void push(std::unique_ptr<T> Item) {
|
| + WorkItems[Back++ & MaxStaticSizeMask] = std::move(Item);
|
| assert(size() <= MaxStaticSize);
|
| }
|
| - T *pop() {
|
| + std::unique_ptr<T> pop() {
|
| assert(!empty());
|
| - return WorkItems[Front++ & MaxStaticSizeMask];
|
| + return std::move(WorkItems[Front++ & MaxStaticSizeMask]);
|
| }
|
| };
|
|
|
| @@ -174,11 +176,11 @@ public:
|
| /// Constructor for a WI_Nop work item.
|
| explicit EmitterWorkItem(uint32_t Seq);
|
| /// Constructor for a WI_GlobalInits work item.
|
| - EmitterWorkItem(uint32_t Seq, VariableDeclarationList *D);
|
| + EmitterWorkItem(uint32_t Seq, std::unique_ptr<VariableDeclarationList> D);
|
| /// Constructor for a WI_Asm work item.
|
| - EmitterWorkItem(uint32_t Seq, Assembler *A);
|
| + EmitterWorkItem(uint32_t Seq, std::unique_ptr<Assembler> A);
|
| /// Constructor for a WI_Cfg work item.
|
| - EmitterWorkItem(uint32_t Seq, Cfg *F);
|
| + EmitterWorkItem(uint32_t Seq, std::unique_ptr<Cfg> F);
|
| uint32_t getSequenceNumber() const { return Sequence; }
|
| ItemKind getKind() const { return Kind; }
|
| void setGlobalInits(std::unique_ptr<VariableDeclarationList> GloblInits);
|
|
|