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.


Reply via email to