Reviewers: Michael Starzinger,
Description:
Only finalize sweeping in EnsureSweeperProgress() when sweeper threads are
done.
BUG=
Please review this at https://codereview.chromium.org/12450002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/mark-compact.h
M src/mark-compact.cc
M src/spaces.cc
M src/sweeper-thread.h
M src/sweeper-thread.cc
Index: src/mark-compact.cc
diff --git a/src/mark-compact.cc b/src/mark-compact.cc
index
ea797a5866a63fb26dd46b76baeadb85effeccc6..975e5d84263e9465f36dff6c42c0689f486b8bfd
100644
--- a/src/mark-compact.cc
+++ b/src/mark-compact.cc
@@ -574,6 +574,11 @@ intptr_t MarkCompactCollector::
}
+bool MarkCompactCollector::AreSweeperThreadsRunning() {
+ return SweeperThread::Running();
+}
+
+
bool MarkCompactCollector::AreSweeperThreadsActivated() {
return heap()->isolate()->sweeper_threads() != NULL;
}
Index: src/mark-compact.h
diff --git a/src/mark-compact.h b/src/mark-compact.h
index
b5d60fd41e80f81f5395dff0ee0f665dc161c8d2..80ce574716f914e2d18e69ea7a71438cdd3083db
100644
--- a/src/mark-compact.h
+++ b/src/mark-compact.h
@@ -692,6 +692,8 @@ class MarkCompactCollector {
intptr_t StealMemoryFromSweeperThreads(PagedSpace* space);
+ bool AreSweeperThreadsRunning();
+
bool AreSweeperThreadsActivated();
bool IsConcurrentSweepingInProgress();
Index: src/spaces.cc
diff --git a/src/spaces.cc b/src/spaces.cc
index
0af587d2052263e6168b65cb1573ceb5a99203c4..d4fd5fe1a52f0f73fc94786e93d9f9a07aa4d58d
100644
--- a/src/spaces.cc
+++ b/src/spaces.cc
@@ -2553,9 +2553,11 @@ bool PagedSpace::EnsureSweeperProgress(intptr_t
size_in_bytes) {
if (collector->AreSweeperThreadsActivated()) {
if (collector->IsConcurrentSweepingInProgress()) {
if (collector->StealMemoryFromSweeperThreads(this) < size_in_bytes) {
- collector->WaitUntilSweepingCompleted();
- collector->FinalizeSweeping();
- return true;
+ if (!collector->AreSweeperThreadsRunning()) {
+ collector->WaitUntilSweepingCompleted();
+ collector->FinalizeSweeping();
+ return true;
+ }
}
return false;
}
Index: src/sweeper-thread.cc
diff --git a/src/sweeper-thread.cc b/src/sweeper-thread.cc
index
f08fcfbc6f8297401c4f360397112042bcb373d1..578ebb29468b9893a288a3f40f5baf8a71ba984d
100644
--- a/src/sweeper-thread.cc
+++ b/src/sweeper-thread.cc
@@ -37,6 +37,8 @@ namespace internal {
static const int kSweeperThreadStackSize = 64 * KB;
+AtomicWord SweeperThread::running_threads_ = 0;
+
SweeperThread::SweeperThread(Isolate* isolate)
: Thread(Thread::Options("v8:SweeperThread",
kSweeperThreadStackSize)),
isolate_(isolate),
@@ -58,6 +60,7 @@ void SweeperThread::Run() {
Isolate::SetIsolateThreadLocals(isolate_, NULL);
while (true) {
start_sweeping_semaphore_->Wait();
+ NoBarrier_AtomicIncrement(&running_threads_, 1);
if (Acquire_Load(&stop_thread_)) {
stop_semaphore_->Signal();
@@ -71,6 +74,7 @@ void SweeperThread::Run() {
&private_free_list_old_pointer_space_,
&free_list_old_pointer_space_);
end_sweeping_semaphore_->Signal();
+ NoBarrier_AtomicIncrement(&running_threads_, -1);
}
}
Index: src/sweeper-thread.h
diff --git a/src/sweeper-thread.h b/src/sweeper-thread.h
index
a170982141dbac2987f68685d0f4cfff6f358411..f9e35c38dc4de99e7824f733138a5f171516fb85
100644
--- a/src/sweeper-thread.h
+++ b/src/sweeper-thread.h
@@ -56,6 +56,10 @@ class SweeperThread : public Thread {
delete stop_semaphore_;
}
+ static bool Running() {
+ return running_threads_ != 0;
+ }
+
private:
Isolate* isolate_;
Heap* heap_;
@@ -68,6 +72,8 @@ class SweeperThread : public Thread {
FreeList private_free_list_old_data_space_;
FreeList private_free_list_old_pointer_space_;
volatile AtomicWord stop_thread_;
+
+ static AtomicWord running_threads_;
};
} } // namespace v8::internal
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.