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