summaryrefslogtreecommitdiff
path: root/deps/v8/src/heap/concurrent-marking-deque.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/heap/concurrent-marking-deque.h')
-rw-r--r--deps/v8/src/heap/concurrent-marking-deque.h175
1 files changed, 0 insertions, 175 deletions
diff --git a/deps/v8/src/heap/concurrent-marking-deque.h b/deps/v8/src/heap/concurrent-marking-deque.h
deleted file mode 100644
index 1490923a2f..0000000000
--- a/deps/v8/src/heap/concurrent-marking-deque.h
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2017 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_HEAP_CONCURRENT_MARKING_DEQUE_
-#define V8_HEAP_CONCURRENT_MARKING_DEQUE_
-
-#include <deque>
-
-#include "src/base/platform/mutex.h"
-
-namespace v8 {
-namespace internal {
-
-class Heap;
-class Isolate;
-class HeapObject;
-
-enum class MarkingThread { kMain, kConcurrent };
-
-enum class TargetDeque { kShared, kBailout };
-
-// The concurrent marking deque supports deque operations for two threads:
-// main and concurrent. It is implemented using two deques: shared and bailout.
-//
-// The concurrent thread can use the push and pop operations with the
-// MarkingThread::kConcurrent argument. All other operations are intended
-// to be used by the main thread only.
-//
-// The interface of the concurrent marking deque for the main thread matches
-// that of the sequential marking deque, so they can be easily switched
-// at compile time without updating the main thread call-sites.
-//
-// The shared deque is shared between the main thread and the concurrent
-// thread, so both threads can push to and pop from the shared deque.
-// The bailout deque stores objects that cannot be processed by the concurrent
-// thread. Only the concurrent thread can push to it and only the main thread
-// can pop from it.
-class ConcurrentMarkingDeque {
- public:
- // The heap parameter is needed to match the interface
- // of the sequential marking deque.
- explicit ConcurrentMarkingDeque(Heap* heap) {}
-
- // Pushes the object into the specified deque assuming that the function is
- // called on the specified thread. The main thread can push only to the shared
- // deque. The concurrent thread can push to both deques.
- bool Push(HeapObject* object, MarkingThread thread = MarkingThread::kMain,
- TargetDeque target = TargetDeque::kShared) {
- switch (target) {
- case TargetDeque::kShared:
- shared_deque_.Push(object);
- break;
- case TargetDeque::kBailout:
- bailout_deque_.Push(object);
- break;
- }
- return true;
- }
-
- // Pops an object from the bailout or shared deque assuming that the function
- // is called on the specified thread. The main thread first tries to pop the
- // bailout deque. If the deque is empty then it tries the shared deque.
- // If the shared deque is also empty, then the function returns nullptr.
- // The concurrent thread pops only from the shared deque.
- HeapObject* Pop(MarkingThread thread = MarkingThread::kMain) {
- if (thread == MarkingThread::kMain) {
- HeapObject* result = bailout_deque_.Pop();
- if (result != nullptr) return result;
- }
- return shared_deque_.Pop();
- }
-
- // All the following operations can used only by the main thread.
- void Clear() {
- bailout_deque_.Clear();
- shared_deque_.Clear();
- }
-
- bool IsFull() { return false; }
-
- bool IsEmpty() { return bailout_deque_.IsEmpty() && shared_deque_.IsEmpty(); }
-
- int Size() { return bailout_deque_.Size() + shared_deque_.Size(); }
-
- // This is used for a large array with a progress bar.
- // For simpicity, unshift to the bailout deque so that the concurrent thread
- // does not see such objects.
- bool Unshift(HeapObject* object) {
- bailout_deque_.Unshift(object);
- return true;
- }
-
- // Calls the specified callback on each element of the deques and replaces
- // the element with the result of the callback. If the callback returns
- // nullptr then the element is removed from the deque.
- // The callback must accept HeapObject* and return HeapObject*.
- template <typename Callback>
- void Update(Callback callback) {
- bailout_deque_.Update(callback);
- shared_deque_.Update(callback);
- }
-
- // These empty functions are needed to match the interface
- // of the sequential marking deque.
- void SetUp() {}
- void TearDown() {}
- void StartUsing() {}
- void StopUsing() {}
- void ClearOverflowed() {}
- void SetOverflowed() {}
- bool overflowed() const { return false; }
-
- private:
- // Simple, slow, and thread-safe deque that forwards all operations to
- // a lock-protected std::deque.
- class Deque {
- public:
- Deque() { cache_padding_[0] = 0; }
- void Clear() {
- base::LockGuard<base::Mutex> guard(&mutex_);
- return deque_.clear();
- }
- bool IsEmpty() {
- base::LockGuard<base::Mutex> guard(&mutex_);
- return deque_.empty();
- }
- int Size() {
- base::LockGuard<base::Mutex> guard(&mutex_);
- return static_cast<int>(deque_.size());
- }
- void Push(HeapObject* object) {
- base::LockGuard<base::Mutex> guard(&mutex_);
- deque_.push_back(object);
- }
- HeapObject* Pop() {
- base::LockGuard<base::Mutex> guard(&mutex_);
- if (deque_.empty()) return nullptr;
- HeapObject* result = deque_.back();
- deque_.pop_back();
- return result;
- }
- void Unshift(HeapObject* object) {
- base::LockGuard<base::Mutex> guard(&mutex_);
- deque_.push_front(object);
- }
- template <typename Callback>
- void Update(Callback callback) {
- base::LockGuard<base::Mutex> guard(&mutex_);
- std::deque<HeapObject*> new_deque;
- for (auto object : deque_) {
- HeapObject* new_object = callback(object);
- if (new_object) {
- new_deque.push_back(new_object);
- }
- }
- deque_.swap(new_deque);
- }
-
- private:
- base::Mutex mutex_;
- std::deque<HeapObject*> deque_;
- // Ensure that two deques do not share the same cache line.
- static int const kCachePadding = 64;
- char cache_padding_[kCachePadding];
- };
- Deque bailout_deque_;
- Deque shared_deque_;
- DISALLOW_COPY_AND_ASSIGN(ConcurrentMarkingDeque);
-};
-
-} // namespace internal
-} // namespace v8
-
-#endif // V8_CONCURRENT_MARKING_DEQUE_