Revision: 15947
Author:   [email protected]
Date:     Tue Jul 30 01:35:48 2013
Log: Re-revert "Flush parallel recompilation queues on context dispose notification" (r15883).

[email protected]
BUG=

Review URL: https://codereview.chromium.org/21156009
http://code.google.com/p/v8/source/detail?r=15947

Deleted:
/branches/bleeding_edge/test/mjsunit/regress/regress-prepare-break-while-recompile.js
Modified:
 /branches/bleeding_edge/src/api.cc
 /branches/bleeding_edge/src/compiler.cc
 /branches/bleeding_edge/src/debug.cc
 /branches/bleeding_edge/src/factory.cc
 /branches/bleeding_edge/src/heap.cc
 /branches/bleeding_edge/src/heap.h
 /branches/bleeding_edge/src/isolate.cc
 /branches/bleeding_edge/src/isolate.h
 /branches/bleeding_edge/src/liveedit.cc
 /branches/bleeding_edge/src/objects.cc
 /branches/bleeding_edge/src/optimizing-compiler-thread.cc
 /branches/bleeding_edge/src/optimizing-compiler-thread.h
 /branches/bleeding_edge/src/runtime.cc
 /branches/bleeding_edge/test/cctest/test-deoptimization.cc
 /branches/bleeding_edge/test/cctest/test-heap.cc

=======================================
--- /branches/bleeding_edge/test/mjsunit/regress/regress-prepare-break-while-recompile.js Fri Jul 26 05:34:46 2013
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// Flags: --expose-debug-as debug --allow-natives-syntax
-// Flags: --parallel-recompilation-delay=300
-
-if (!%IsParallelRecompilationSupported()) {
-  print("Parallel recompilation is disabled. Skipping this test.");
-  quit();
-}
-
-Debug = debug.Debug
-
-function foo() {
-  var x = 1;
-  return x;
-}
-
-function bar() {
-  var x = 2;
-  return x;
-}
-
-foo();
-// Mark and trigger parallel optimization.
-%OptimizeFunctionOnNextCall(foo, "parallel");
-foo();
-
-// Set break points on an unrelated function. This clears both optimized
-// and (shared) unoptimized code on foo, and sets both to lazy-compile builtin.
-// Clear the break point immediately after to deactivate the debugger.
-Debug.setBreakPoint(bar, 0, 0);
-Debug.clearAllBreakPoints();
-
-// Install optimized code when parallel optimization finishes.
-// This needs to be able to deal with shared code being a builtin.
-assertUnoptimized(foo, "sync");
-
=======================================
--- /branches/bleeding_edge/src/api.cc  Tue Jul 30 00:05:15 2013
+++ /branches/bleeding_edge/src/api.cc  Tue Jul 30 01:35:48 2013
@@ -770,6 +770,7 @@
   i::Context* last_context =
       isolate->handle_scope_implementer()->RestoreContext();
   isolate->set_context(last_context);
+  isolate->set_context_exit_happened(true);
 }


=======================================
--- /branches/bleeding_edge/src/compiler.cc     Mon Jul 29 10:59:02 2013
+++ /branches/bleeding_edge/src/compiler.cc     Tue Jul 30 01:35:48 2013
@@ -967,9 +967,7 @@

   if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) {
     if (FLAG_trace_parallel_recompilation) {
-      PrintF("  ** Compilation queue full, will retry optimizing ");
-      closure->PrintName();
-      PrintF(" on next run.\n");
+      PrintF("  ** Compilation queue, will retry opting on next run.\n");
     }
     return;
   }
=======================================
--- /branches/bleeding_edge/src/debug.cc        Thu Jul 25 08:01:23 2013
+++ /branches/bleeding_edge/src/debug.cc        Tue Jul 30 01:35:48 2013
@@ -2044,10 +2044,6 @@
   // If preparing for the first break point make sure to deoptimize all
   // functions as debugging does not work with optimized code.
   if (!has_break_points_) {
-    if (FLAG_parallel_recompilation) {
-      isolate_->optimizing_compiler_thread()->Flush();
-    }
-
     Deoptimizer::DeoptimizeAll(isolate_);

     Handle<Code> lazy_compile =
=======================================
--- /branches/bleeding_edge/src/factory.cc      Mon Jul 29 10:59:02 2013
+++ /branches/bleeding_edge/src/factory.cc      Tue Jul 30 01:35:48 2013
@@ -1219,7 +1219,6 @@
   shared->set_num_literals(literals_array_size);
   if (is_generator) {
     shared->set_instance_class_name(isolate()->heap()->Generator_string());
-    shared->DisableOptimization("generator");
   }
   return shared;
 }
=======================================
--- /branches/bleeding_edge/src/heap.cc Thu Jul 25 09:01:02 2013
+++ /branches/bleeding_edge/src/heap.cc Tue Jul 30 01:35:48 2013
@@ -701,16 +701,6 @@

   return next_gc_likely_to_collect_more;
 }
-
-
-int Heap::NotifyContextDisposed() {
-  if (FLAG_parallel_recompilation) {
-    // Flush the queued recompilation tasks.
-    isolate()->optimizing_compiler_thread()->Flush();
-  }
-  flush_monomorphic_ics_ = true;
-  return ++contexts_disposed_;
-}


 void Heap::PerformScavenge() {
=======================================
--- /branches/bleeding_edge/src/heap.h  Thu Jul 25 09:01:02 2013
+++ /branches/bleeding_edge/src/heap.h  Tue Jul 30 01:35:48 2013
@@ -1254,7 +1254,10 @@
   void EnsureHeapIsIterable();

   // Notify the heap that a context has been disposed.
-  int NotifyContextDisposed();
+  int NotifyContextDisposed() {
+    flush_monomorphic_ics_ = true;
+    return ++contexts_disposed_;
+  }

   // Utility to invoke the scavenger. This is needed in test code to
   // ensure correct callback for weak global handles.
=======================================
--- /branches/bleeding_edge/src/isolate.cc      Mon Jul 29 10:59:02 2013
+++ /branches/bleeding_edge/src/isolate.cc      Tue Jul 30 01:35:48 2013
@@ -1782,6 +1782,7 @@
       regexp_stack_(NULL),
       date_cache_(NULL),
       code_stub_interface_descriptors_(NULL),
+      context_exit_happened_(false),
       initialized_from_snapshot_(false),
       cpu_profiler_(NULL),
       heap_profiler_(NULL),
=======================================
--- /branches/bleeding_edge/src/isolate.h       Mon Jul 29 05:12:39 2013
+++ /branches/bleeding_edge/src/isolate.h       Tue Jul 30 01:35:48 2013
@@ -1059,6 +1059,13 @@
   void SetTopLookupResult(LookupResult* top) {
     thread_local_top_.top_lookup_result_ = top;
   }
+
+  bool context_exit_happened() {
+    return context_exit_happened_;
+  }
+  void set_context_exit_happened(bool context_exit_happened) {
+    context_exit_happened_ = context_exit_happened;
+  }

   bool initialized_from_snapshot() { return initialized_from_snapshot_; }

@@ -1307,6 +1314,10 @@
unibrow::Mapping<unibrow::Ecma262Canonicalize> interp_canonicalize_mapping_;
   CodeStubInterfaceDescriptor* code_stub_interface_descriptors_;

+  // The garbage collector should be a little more aggressive when it knows
+  // that a context was recently exited.
+  bool context_exit_happened_;
+
   // True if this isolate was initialized from a snapshot.
   bool initialized_from_snapshot_;

=======================================
--- /branches/bleeding_edge/src/liveedit.cc     Mon Jul 29 10:59:02 2013
+++ /branches/bleeding_edge/src/liveedit.cc     Tue Jul 30 01:35:48 2013
@@ -1290,7 +1290,6 @@
     if (code_scope_info->IsFixedArray()) {
       shared_info->set_scope_info(ScopeInfo::cast(*code_scope_info));
     }
-    shared_info->DisableOptimization("LiveEdit");
   }

   if (shared_info->debug_info()->IsDebugInfo()) {
=======================================
--- /branches/bleeding_edge/src/objects.cc      Thu Jul 25 08:01:23 2013
+++ /branches/bleeding_edge/src/objects.cc      Tue Jul 30 01:35:48 2013
@@ -9234,7 +9234,6 @@
   ASSERT(!IsOptimized());
   ASSERT(shared()->allows_lazy_compilation() ||
          code()->optimizable());
-  ASSERT(!shared()->is_generator());
   set_code_no_write_barrier(
       GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile));
   // No write barrier required, since the builtin is part of the root set.
@@ -9245,8 +9244,10 @@
   ASSERT(is_compiled() || GetIsolate()->DebuggerHasBreakPoints());
   ASSERT(!IsOptimized());
   ASSERT(shared()->allows_lazy_compilation() || code()->optimizable());
-  ASSERT(!shared()->is_generator());
-  ASSERT(FLAG_parallel_recompilation);
+  if (!FLAG_parallel_recompilation) {
+    JSFunction::MarkForLazyRecompilation();
+    return;
+  }
   if (FLAG_trace_parallel_recompilation) {
     PrintF("  ** Marking ");
     PrintName();
=======================================
--- /branches/bleeding_edge/src/optimizing-compiler-thread.cc Thu Jul 25 08:01:23 2013 +++ /branches/bleeding_edge/src/optimizing-compiler-thread.cc Tue Jul 30 01:35:48 2013
@@ -60,23 +60,12 @@
       OS::Sleep(FLAG_parallel_recompilation_delay);
     }

-    switch (static_cast<StopFlag>(Acquire_Load(&stop_thread_))) {
-      case CONTINUE:
-        break;
-      case STOP:
-        if (FLAG_trace_parallel_recompilation) {
-          time_spent_total_ = OS::Ticks() - epoch;
-        }
-        stop_semaphore_->Signal();
-        return;
-      case FLUSH:
-        // Reset input queue semaphore.
-        delete input_queue_semaphore_;
-        input_queue_semaphore_ = OS::CreateSemaphore(0);
-        // Signal for main thread to start flushing.
-        stop_semaphore_->Signal();
-        // Return to start of consumer loop.
-        continue;
+    if (Acquire_Load(&stop_thread_)) {
+      stop_semaphore_->Signal();
+      if (FLAG_trace_parallel_recompilation) {
+        time_spent_total_ = OS::Ticks() - epoch;
+      }
+      return;
     }

     int64_t compiling_start = 0;
@@ -111,43 +100,11 @@
   }
   output_queue_.Enqueue(optimizing_compiler);
 }
-
-
-void OptimizingCompilerThread::FlushQueue(
-    UnboundQueue<OptimizingCompiler*>* queue,
-    bool restore_function_code) {
-  ASSERT(!IsOptimizerThread());
-  OptimizingCompiler* optimizing_compiler;
-  // The optimizing compiler is allocated in the CompilationInfo's zone.
-  while (queue->Dequeue(&optimizing_compiler)) {
-    CompilationInfo* info = optimizing_compiler->info();
-    if (restore_function_code) {
-      Handle<JSFunction> function = info->closure();
-      function->ReplaceCode(function->shared()->code());
-    }
-    delete info;
-  }
-}
-
-
-void OptimizingCompilerThread::Flush() {
-  ASSERT(!IsOptimizerThread());
-  Release_Store(&stop_thread_, static_cast<AtomicWord>(FLUSH));
-  input_queue_semaphore_->Signal();
-
-  FlushQueue(&input_queue_, true);
-  NoBarrier_Store(&queue_length_, static_cast<AtomicWord>(0));
-
-  stop_semaphore_->Wait();
-  Release_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
-
-  FlushQueue(&output_queue_, true);
-}


 void OptimizingCompilerThread::Stop() {
   ASSERT(!IsOptimizerThread());
-  Release_Store(&stop_thread_, static_cast<AtomicWord>(STOP));
+  Release_Store(&stop_thread_, static_cast<AtomicWord>(true));
   input_queue_semaphore_->Signal();
   stop_semaphore_->Wait();

@@ -157,8 +114,14 @@
     while (NoBarrier_Load(&queue_length_) > 0) CompileNext();
     InstallOptimizedFunctions();
   } else {
-    FlushQueue(&input_queue_, false);
-    FlushQueue(&output_queue_, false);
+    OptimizingCompiler* optimizing_compiler;
+    // The optimizing compiler is allocated in the CompilationInfo's zone.
+    while (input_queue_.Dequeue(&optimizing_compiler)) {
+      delete optimizing_compiler->info();
+    }
+    while (output_queue_.Dequeue(&optimizing_compiler)) {
+      delete optimizing_compiler->info();
+    }
   }

   if (FLAG_trace_parallel_recompilation) {
=======================================
--- /branches/bleeding_edge/src/optimizing-compiler-thread.h Thu Jul 25 08:01:23 2013 +++ /branches/bleeding_edge/src/optimizing-compiler-thread.h Tue Jul 30 01:35:48 2013
@@ -54,13 +54,13 @@
       install_mutex_(OS::CreateMutex()),
       time_spent_compiling_(0),
       time_spent_total_(0) {
-    NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE));
+    NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(false));
     NoBarrier_Store(&queue_length_, static_cast<AtomicWord>(0));
   }

   void Run();
   void Stop();
-  void Flush();
+  void CompileNext();
   void QueueForOptimization(OptimizingCompiler* optimizing_compiler);
   void InstallOptimizedFunctions();

@@ -92,12 +92,6 @@
   }

  private:
-  enum StopFlag { CONTINUE, STOP, FLUSH };
-
-  void FlushQueue(UnboundQueue<OptimizingCompiler*>* queue,
-                  bool restore_function_code);
-  void CompileNext();
-
 #ifdef DEBUG
   int thread_id_;
   Mutex* thread_id_mutex_;
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Mon Jul 29 10:59:02 2013
+++ /branches/bleeding_edge/src/runtime.cc      Tue Jul 30 01:35:48 2013
@@ -2948,7 +2948,6 @@
   JavaScriptFrame* frame = stack_iterator.frame();

   ASSERT_EQ(frame->function(), generator_object->function());
-  ASSERT(frame->function()->is_compiled());

   STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting <= 0);
   STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed <= 0);
@@ -8432,7 +8431,8 @@
   }
   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
   if (FLAG_parallel_recompilation && sync_with_compiler_thread) {
-    while (function->IsInRecompileQueue() ||
+    while (function->IsMarkedForParallelRecompilation() ||
+           function->IsInRecompileQueue() ||
            function->IsMarkedForInstallingRecompiledCode()) {
       isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
       OS::Sleep(50);
=======================================
--- /branches/bleeding_edge/test/cctest/test-deoptimization.cc Thu Jul 25 08:01:23 2013 +++ /branches/bleeding_edge/test/cctest/test-deoptimization.cc Tue Jul 30 01:35:48 2013
@@ -77,27 +77,23 @@

 // Utility class to set --allow-natives-syntax and --nouse-inlining when
 // constructed and return to their default state when destroyed.
-class AllowNativesSyntaxNoInliningNoParallel {
+class AllowNativesSyntaxNoInlining {
  public:
-  AllowNativesSyntaxNoInliningNoParallel()
+  AllowNativesSyntaxNoInlining()
       : allow_natives_syntax_(i::FLAG_allow_natives_syntax),
-        use_inlining_(i::FLAG_use_inlining),
-        parallel_recompilation_(i::FLAG_parallel_recompilation) {
+        use_inlining_(i::FLAG_use_inlining) {
     i::FLAG_allow_natives_syntax = true;
     i::FLAG_use_inlining = false;
-    i::FLAG_parallel_recompilation = false;
   }

-  ~AllowNativesSyntaxNoInliningNoParallel() {
+  ~AllowNativesSyntaxNoInlining() {
     i::FLAG_allow_natives_syntax = allow_natives_syntax_;
     i::FLAG_use_inlining = use_inlining_;
-    i::FLAG_parallel_recompilation = parallel_recompilation_;
   }

  private:
   bool allow_natives_syntax_;
   bool use_inlining_;
-  bool parallel_recompilation_;
 };


@@ -347,7 +343,7 @@
   const char* f_source = "function f(x, y) { return x + y; };";

   {
-    AllowNativesSyntaxNoInliningNoParallel options;
+    AllowNativesSyntaxNoInlining options;
// Compile function f and collect to type feedback to insert binary op stub
     // call in the optimized code.
     i::FLAG_prepare_always_opt = true;
@@ -405,7 +401,7 @@
                binary_op);
   char* f_source = f_source_buffer.start();

-  AllowNativesSyntaxNoInliningNoParallel options;
+  AllowNativesSyntaxNoInlining options;
// Compile function f and collect to type feedback to insert binary op stub
   // call in the optimized code.
   i::FLAG_prepare_always_opt = true;
@@ -497,7 +493,7 @@
   const char* f_source = "function f(x, y) { return x < y; };";

   {
-    AllowNativesSyntaxNoInliningNoParallel options;
+    AllowNativesSyntaxNoInlining options;
     // Compile function f and collect to type feedback to insert compare ic
     // call in the optimized code.
     i::FLAG_prepare_always_opt = true;
@@ -544,7 +540,7 @@
   const char* g2_source = "function g2(x, y) { x[y] = 1; };";

   {
-    AllowNativesSyntaxNoInliningNoParallel options;
+    AllowNativesSyntaxNoInlining options;
     // Compile functions and collect to type feedback to insert ic
     // calls in the optimized code.
     i::FLAG_prepare_always_opt = true;
@@ -624,7 +620,7 @@
   const char* g2_source = "function g2(x, y) { x[y] = 1; };";

   {
-    AllowNativesSyntaxNoInliningNoParallel options;
+    AllowNativesSyntaxNoInlining options;
     // Compile functions and collect to type feedback to insert ic
     // calls in the optimized code.
     i::FLAG_prepare_always_opt = true;
=======================================
--- /branches/bleeding_edge/test/cctest/test-heap.cc Thu Jul 25 08:01:23 2013 +++ /branches/bleeding_edge/test/cctest/test-heap.cc Tue Jul 30 01:35:48 2013
@@ -2826,7 +2826,6 @@
   // to check whether the data is being released since the external string
   // resource's callback is fired when the external string is GC'ed.
   FLAG_use_ic = false;  // ICs retain objects.
-  FLAG_parallel_recompilation = false;
   CcTest::InitializeVM();
   v8::HandleScope scope(CcTest::isolate());
   SourceResource* resource = new SourceResource(i::StrDup(source));

--
--
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