19155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
49155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
59155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org#ifndef V8_UNBOUND_QUEUE_INL_H_
69155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org#define V8_UNBOUND_QUEUE_INL_H_
79155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/unbound-queue.h"
99155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
109155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgnamespace v8 {
119155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgnamespace internal {
129155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
139155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
149155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgstruct UnboundQueue<Record>::Node: public Malloced {
159155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  explicit Node(const Record& value)
169155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org      : value(value), next(NULL) {
179155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  }
189155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
199155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Record value;
209155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Node* next;
219155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org};
229155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
239155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
249155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
259155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgUnboundQueue<Record>::UnboundQueue() {
269155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  first_ = new Node(Record());
271e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  divider_ = last_ = reinterpret_cast<base::AtomicWord>(first_);
289155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
299155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
309155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
319155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
329155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgUnboundQueue<Record>::~UnboundQueue() {
339155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  while (first_ != NULL) DeleteFirst();
349155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
359155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
369155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
379155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
389155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvoid UnboundQueue<Record>::DeleteFirst() {
399155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Node* tmp = first_;
409155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  first_ = tmp->next;
419155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  delete tmp;
429155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
439155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
449155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
459155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool UnboundQueue<Record>::Dequeue(Record* rec) {
471e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  if (divider_ == base::Acquire_Load(&last_)) return false;
489155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Node* next = reinterpret_cast<Node*>(divider_)->next;
499155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  *rec = next->value;
501e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  base::Release_Store(&divider_, reinterpret_cast<base::AtomicWord>(next));
511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return true;
529155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
539155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
549155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
559155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgtemplate<typename Record>
569155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.orgvoid UnboundQueue<Record>::Enqueue(const Record& rec) {
579155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  Node*& next = reinterpret_cast<Node*>(last_)->next;
589155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org  next = new Node(rec);
591e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  base::Release_Store(&last_, reinterpret_cast<base::AtomicWord>(next));
601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  while (first_ != reinterpret_cast<Node*>(base::Acquire_Load(&divider_))) {
621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    DeleteFirst();
631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
641510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgtemplate<typename Record>
681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgbool UnboundQueue<Record>::IsEmpty() const {
691e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return base::NoBarrier_Load(&divider_) == base::NoBarrier_Load(&last_);
709155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org}
719155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
7282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
7382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgtemplate<typename Record>
741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgRecord* UnboundQueue<Record>::Peek() const {
751e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  if (divider_ == base::Acquire_Load(&last_)) return NULL;
7682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  Node* next = reinterpret_cast<Node*>(divider_)->next;
7782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  return &next->value;
7882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
7982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
809155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org} }  // namespace v8::internal
819155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org
829155e252524a2bf92aecd27493feafed86702312kmillikin@chromium.org#endif  // V8_UNBOUND_QUEUE_INL_H_
83