Commit 35e4a03f authored by machenbach's avatar machenbach Committed by Commit bot

Revert of [heap] Uncommit marking deque in concurrent task. (patchset #7...

Revert of [heap] Uncommit marking deque in concurrent task. (patchset #7 id:120001 of https://codereview.chromium.org/2442443003/ )

Reason for revert:
Seems to break the world, e.g.:
https://build.chromium.org/p/client.v8/builders/V8%20Linux/builds/14118

Original issue's description:
> [heap] Uncommit marking deque in concurrent task.
>
> BUG=

TBR=mlippautz@chromium.org,ulan@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=

Review-Url: https://codereview.chromium.org/2454693002
Cr-Commit-Position: refs/heads/master@{#40588}
parent 126e030e
...@@ -58,7 +58,6 @@ MarkCompactCollector::MarkCompactCollector(Heap* heap) ...@@ -58,7 +58,6 @@ MarkCompactCollector::MarkCompactCollector(Heap* heap)
compacting_(false), compacting_(false),
black_allocation_(false), black_allocation_(false),
have_code_to_deoptimize_(false), have_code_to_deoptimize_(false),
marking_deque_(heap),
code_flusher_(nullptr), code_flusher_(nullptr),
sweeper_(heap) { sweeper_(heap) {
} }
...@@ -2118,13 +2117,9 @@ void MarkingDeque::SetUp() { ...@@ -2118,13 +2117,9 @@ void MarkingDeque::SetUp() {
} }
} }
void MarkingDeque::TearDown() { void MarkingDeque::TearDown() { delete backing_store_; }
CancelOrWaitForUncommitTask();
delete backing_store_;
}
void MarkingDeque::StartUsing() { void MarkingDeque::StartUsing() {
base::LockGuard<base::Mutex> guard(&mutex_);
if (in_use_) { if (in_use_) {
// This can happen in mark-compact GC if the incremental marker already // This can happen in mark-compact GC if the incremental marker already
// started using the marking deque. // started using the marking deque.
...@@ -2144,16 +2139,11 @@ void MarkingDeque::StartUsing() { ...@@ -2144,16 +2139,11 @@ void MarkingDeque::StartUsing() {
} }
void MarkingDeque::StopUsing() { void MarkingDeque::StopUsing() {
base::LockGuard<base::Mutex> guard(&mutex_);
DCHECK(IsEmpty()); DCHECK(IsEmpty());
DCHECK(!overflowed_); DCHECK(!overflowed_);
top_ = bottom_ = mask_ = 0; top_ = bottom_ = mask_ = 0;
Uncommit();
in_use_ = false; in_use_ = false;
if (FLAG_concurrent_sweeping) {
StartUncommitTask();
} else {
Uncommit();
}
} }
void MarkingDeque::Clear() { void MarkingDeque::Clear() {
...@@ -2163,7 +2153,7 @@ void MarkingDeque::Clear() { ...@@ -2163,7 +2153,7 @@ void MarkingDeque::Clear() {
} }
void MarkingDeque::Uncommit() { void MarkingDeque::Uncommit() {
DCHECK(!in_use_); DCHECK(in_use_);
bool success = backing_store_->Uncommit(backing_store_->address(), bool success = backing_store_->Uncommit(backing_store_->address(),
backing_store_committed_size_); backing_store_committed_size_);
backing_store_committed_size_ = 0; backing_store_committed_size_ = 0;
...@@ -2185,28 +2175,6 @@ void MarkingDeque::EnsureCommitted() { ...@@ -2185,28 +2175,6 @@ void MarkingDeque::EnsureCommitted() {
} }
} }
void MarkingDeque::StartUncommitTask() {
if (!uncommit_task_pending_) {
UncommitTask* task = new UncommitTask(heap_->isolate(), this);
uncommit_task_id_ = task->id();
uncommit_task_pending_ = true;
V8::GetCurrentPlatform()->CallOnBackgroundThread(
task, v8::Platform::kShortRunningTask);
}
}
void MarkingDeque::CancelOrWaitForUncommitTask() {
base::LockGuard<base::Mutex> guard(&mutex_);
if (!uncommit_task_pending_ ||
heap_->isolate()->cancelable_task_manager()->TryAbort(
uncommit_task_id_)) {
return;
}
while (uncommit_task_pending_) {
uncommit_task_barrier_.Wait(&mutex_);
}
}
class MarkCompactCollector::ObjectStatsVisitor class MarkCompactCollector::ObjectStatsVisitor
: public MarkCompactCollector::HeapObjectVisitor { : public MarkCompactCollector::HeapObjectVisitor {
public: public:
......
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
#include <deque> #include <deque>
#include "src/base/bits.h" #include "src/base/bits.h"
#include "src/base/platform/condition-variable.h"
#include "src/cancelable-task.h"
#include "src/heap/marking.h" #include "src/heap/marking.h"
#include "src/heap/spaces.h" #include "src/heap/spaces.h"
#include "src/heap/store-buffer.h" #include "src/heap/store-buffer.h"
...@@ -54,7 +52,7 @@ class ObjectMarking : public AllStatic { ...@@ -54,7 +52,7 @@ class ObjectMarking : public AllStatic {
// Marking deque for tracing live objects. // Marking deque for tracing live objects.
class MarkingDeque { class MarkingDeque {
public: public:
explicit MarkingDeque(Heap* heap) MarkingDeque()
: backing_store_(nullptr), : backing_store_(nullptr),
backing_store_committed_size_(0), backing_store_committed_size_(0),
array_(nullptr), array_(nullptr),
...@@ -62,16 +60,11 @@ class MarkingDeque { ...@@ -62,16 +60,11 @@ class MarkingDeque {
bottom_(0), bottom_(0),
mask_(0), mask_(0),
overflowed_(false), overflowed_(false),
in_use_(false), in_use_(false) {}
uncommit_task_pending_(false),
uncommit_task_id_(0),
heap_(heap) {}
void SetUp(); void SetUp();
void TearDown(); void TearDown();
// Ensures that the marking deque is committed and will stay committed until
// StopUsing() is called.
void StartUsing(); void StartUsing();
void StopUsing(); void StopUsing();
void Clear(); void Clear();
...@@ -129,45 +122,12 @@ class MarkingDeque { ...@@ -129,45 +122,12 @@ class MarkingDeque {
void set_top(int top) { top_ = top; } void set_top(int top) { top_ = top; }
private: private:
// This task uncommits the marking_deque backing store if
// markin_deque->in_use_ is false.
class UncommitTask : public CancelableTask {
public:
explicit UncommitTask(Isolate* isolate, MarkingDeque* marking_deque)
: CancelableTask(isolate), marking_deque_(marking_deque) {}
private:
// CancelableTask override.
void RunInternal() override {
base::LockGuard<base::Mutex> guard(&marking_deque_->mutex_);
if (!marking_deque_->in_use_) {
marking_deque_->Uncommit();
}
marking_deque_->uncommit_task_pending_ = false;
marking_deque_->uncommit_task_barrier_.NotifyOne();
}
MarkingDeque* marking_deque_;
DISALLOW_COPY_AND_ASSIGN(UncommitTask);
};
static const size_t kMaxSize = 4 * MB; static const size_t kMaxSize = 4 * MB;
static const size_t kMinSize = 256 * KB; static const size_t kMinSize = 256 * KB;
// Must be called with mutex lock.
void EnsureCommitted(); void EnsureCommitted();
// Must be called with mutex lock.
void Uncommit(); void Uncommit();
// Must be called with mutex lock.
void StartUncommitTask();
void CancelOrWaitForUncommitTask();
base::Mutex mutex_;
base::ConditionVariable uncommit_task_barrier_;
base::VirtualMemory* backing_store_; base::VirtualMemory* backing_store_;
size_t backing_store_committed_size_; size_t backing_store_committed_size_;
HeapObject** array_; HeapObject** array_;
...@@ -178,12 +138,7 @@ class MarkingDeque { ...@@ -178,12 +138,7 @@ class MarkingDeque {
int bottom_; int bottom_;
int mask_; int mask_;
bool overflowed_; bool overflowed_;
// in_use_ == true after taking mutex lock implies that the marking deque is
// committed and will stay committed at least until in_use_ == false.
bool in_use_; bool in_use_;
bool uncommit_task_pending_;
uint32_t uncommit_task_id_;
Heap* heap_;
DISALLOW_COPY_AND_ASSIGN(MarkingDeque); DISALLOW_COPY_AND_ASSIGN(MarkingDeque);
}; };
......
...@@ -51,7 +51,7 @@ using v8::Just; ...@@ -51,7 +51,7 @@ using v8::Just;
TEST(MarkingDeque) { TEST(MarkingDeque) {
CcTest::InitializeVM(); CcTest::InitializeVM();
MarkingDeque s(CcTest::i_isolate()->heap()); MarkingDeque s;
s.SetUp(); s.SetUp();
s.StartUsing(); s.StartUsing();
Address original_address = reinterpret_cast<Address>(&s); Address original_address = reinterpret_cast<Address>(&s);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment