1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_LOCKED_QUEUE_
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_LOCKED_QUEUE_
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/allocation.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/base/platform/platform.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Simple lock-based unbounded size queue (multi producer; multi consumer) based
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// on "Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Algorithms" by M. Scott and M. Michael.
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// See:
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// https://www.cs.rochester.edu/research/synchronization/pseudocode/queues.html
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtemplate <typename Record>
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LockedQueue final BASE_EMBEDDED {
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public:
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline LockedQueue();
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline ~LockedQueue();
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline void Enqueue(const Record& record);
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool Dequeue(Record* record);
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool IsEmpty() const;
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  inline bool Peek(Record* record) const;
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private:
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  struct Node;
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  mutable base::Mutex head_mutex_;
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  base::Mutex tail_mutex_;
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* head_;
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* tail_;
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(LockedQueue);
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch};
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif  // V8_LOCKED_QUEUE_
44