diff options
Diffstat (limited to 'deps/v8/src/locked-queue.h')
-rw-r--r-- | deps/v8/src/locked-queue.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/deps/v8/src/locked-queue.h b/deps/v8/src/locked-queue.h new file mode 100644 index 0000000000..5bb97c8a12 --- /dev/null +++ b/deps/v8/src/locked-queue.h @@ -0,0 +1,43 @@ +// Copyright 2015 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_LOCKED_QUEUE_ +#define V8_LOCKED_QUEUE_ + +#include "src/allocation.h" +#include "src/base/platform/platform.h" + +namespace v8 { +namespace internal { + +// Simple lock-based unbounded size queue (multi producer; multi consumer) based +// on "Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue +// Algorithms" by M. Scott and M. Michael. +// See: +// https://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html +template <typename Record> +class LockedQueue final BASE_EMBEDDED { + public: + inline LockedQueue(); + inline ~LockedQueue(); + inline void Enqueue(const Record& record); + inline bool Dequeue(Record* record); + inline bool IsEmpty() const; + inline bool Peek(Record* record) const; + + private: + struct Node; + + mutable base::Mutex head_mutex_; + base::Mutex tail_mutex_; + Node* head_; + Node* tail_; + + DISALLOW_COPY_AND_ASSIGN(LockedQueue); +}; + +} // namespace internal +} // namespace v8 + +#endif // V8_LOCKED_QUEUE_ |