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(÷r_, 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(÷r_))) { 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(÷r_) == 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