Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: src/IceThreading.h

Issue 1197223002: Subzero: Use C++11 member initializers where practical. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTimerTree.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceThreading.h - Threading functions ---------*- C++ -*-===// 1 //===- subzero/src/IceThreading.h - Threading functions ---------*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file declares threading-related functions. 10 // This file declares threading-related functions.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 // and Back fields. Front==Back indicates an empty queue. 48 // and Back fields. Front==Back indicates an empty queue.
49 template <typename T, size_t MaxStaticSize = 128> 49 template <typename T, size_t MaxStaticSize = 128>
50 class BoundedProducerConsumerQueue { 50 class BoundedProducerConsumerQueue {
51 BoundedProducerConsumerQueue() = delete; 51 BoundedProducerConsumerQueue() = delete;
52 BoundedProducerConsumerQueue(const BoundedProducerConsumerQueue &) = delete; 52 BoundedProducerConsumerQueue(const BoundedProducerConsumerQueue &) = delete;
53 BoundedProducerConsumerQueue & 53 BoundedProducerConsumerQueue &
54 operator=(const BoundedProducerConsumerQueue &) = delete; 54 operator=(const BoundedProducerConsumerQueue &) = delete;
55 55
56 public: 56 public:
57 BoundedProducerConsumerQueue(bool Sequential, size_t MaxSize = MaxStaticSize) 57 BoundedProducerConsumerQueue(bool Sequential, size_t MaxSize = MaxStaticSize)
58 : Back(0), Front(0), MaxSize(std::min(MaxSize, MaxStaticSize)), 58 : MaxSize(std::min(MaxSize, MaxStaticSize)), Sequential(Sequential) {}
59 Sequential(Sequential), IsEnded(false) {}
60 void blockingPush(T *Item) { 59 void blockingPush(T *Item) {
61 { 60 {
62 std::unique_lock<GlobalLockType> L(Lock); 61 std::unique_lock<GlobalLockType> L(Lock);
63 // If the work queue is already "full", wait for a consumer to 62 // If the work queue is already "full", wait for a consumer to
64 // grab an element and shrink the queue. 63 // grab an element and shrink the queue.
65 Shrunk.wait(L, [this] { return size() < MaxSize || Sequential; }); 64 Shrunk.wait(L, [this] { return size() < MaxSize || Sequential; });
66 push(Item); 65 push(Item);
67 } 66 }
68 GrewOrEnded.notify_one(); 67 GrewOrEnded.notify_one();
69 } 68 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 ICE_CACHELINE_BOUNDARY; 104 ICE_CACHELINE_BOUNDARY;
106 // GrewOrEnded is written by the producers and read by the 105 // GrewOrEnded is written by the producers and read by the
107 // consumers. It is notified (by the producer) when something is 106 // consumers. It is notified (by the producer) when something is
108 // added to the queue, in case consumers are waiting for a non-empty 107 // added to the queue, in case consumers are waiting for a non-empty
109 // queue. 108 // queue.
110 std::condition_variable GrewOrEnded; 109 std::condition_variable GrewOrEnded;
111 // Back is the index into WorkItems[] of where the next element will 110 // Back is the index into WorkItems[] of where the next element will
112 // be pushed. (More precisely, Back&MaxStaticSize is the index.) 111 // be pushed. (More precisely, Back&MaxStaticSize is the index.)
113 // It is written by the producers, and read by all via size() and 112 // It is written by the producers, and read by all via size() and
114 // empty(). 113 // empty().
115 size_t Back; 114 size_t Back = 0;
116 115
117 ICE_CACHELINE_BOUNDARY; 116 ICE_CACHELINE_BOUNDARY;
118 // Shrunk is notified (by the consumer) when something is removed 117 // Shrunk is notified (by the consumer) when something is removed
119 // from the queue, in case a producer is waiting for the queue to 118 // from the queue, in case a producer is waiting for the queue to
120 // drop below maximum capacity. It is written by the consumers and 119 // drop below maximum capacity. It is written by the consumers and
121 // read by the producers. 120 // read by the producers.
122 std::condition_variable Shrunk; 121 std::condition_variable Shrunk;
123 // Front is the index into WorkItems[] of the oldest element, 122 // Front is the index into WorkItems[] of the oldest element,
124 // i.e. the next to be popped. (More precisely Front&MaxStaticSize 123 // i.e. the next to be popped. (More precisely Front&MaxStaticSize
125 // is the index.) It is written by the consumers, and read by all 124 // is the index.) It is written by the consumers, and read by all
126 // via size() and empty(). 125 // via size() and empty().
127 size_t Front; 126 size_t Front = 0;
128 127
129 ICE_CACHELINE_BOUNDARY; 128 ICE_CACHELINE_BOUNDARY;
130 129
131 // MaxSize and Sequential are read by all and written by none. 130 // MaxSize and Sequential are read by all and written by none.
132 const size_t MaxSize; 131 const size_t MaxSize;
133 const bool Sequential; 132 const bool Sequential;
134 // IsEnded is read by the consumers, and only written once by the 133 // IsEnded is read by the consumers, and only written once by the
135 // producer. 134 // producer.
136 bool IsEnded; 135 bool IsEnded = false;
137 136
138 // The lock must be held when the following methods are called. 137 // The lock must be held when the following methods are called.
139 bool empty() const { return Front == Back; } 138 bool empty() const { return Front == Back; }
140 size_t size() const { return Back - Front; } 139 size_t size() const { return Back - Front; }
141 void push(T *Item) { 140 void push(T *Item) {
142 WorkItems[Back++ & MaxStaticSizeMask] = Item; 141 WorkItems[Back++ & MaxStaticSizeMask] = Item;
143 assert(size() <= MaxStaticSize); 142 assert(size() <= MaxStaticSize);
144 } 143 }
145 T *pop() { 144 T *pop() {
146 assert(!empty()); 145 assert(!empty());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 const uint32_t Sequence; 198 const uint32_t Sequence;
200 const ItemKind Kind; 199 const ItemKind Kind;
201 std::unique_ptr<VariableDeclarationList> GlobalInits; 200 std::unique_ptr<VariableDeclarationList> GlobalInits;
202 std::unique_ptr<Assembler> Function; 201 std::unique_ptr<Assembler> Function;
203 std::unique_ptr<Cfg> RawFunc; 202 std::unique_ptr<Cfg> RawFunc;
204 }; 203 };
205 204
206 } // end of namespace Ice 205 } // end of namespace Ice
207 206
208 #endif // SUBZERO_SRC_ICETHREADING_H 207 #endif // SUBZERO_SRC_ICETHREADING_H
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX8632.cpp ('k') | src/IceTimerTree.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698