Chromium Code Reviews| Index: src/optimizing-compiler-thread.h |
| diff --git a/src/optimizing-compiler-thread.h b/src/optimizing-compiler-thread.h |
| index 10ed420b7f5b367ddefd8593e2f07bdfd60d6e5d..8d330201c2bc1d3f965370fa4b4d493f379e304b 100644 |
| --- a/src/optimizing-compiler-thread.h |
| +++ b/src/optimizing-compiler-thread.h |
| @@ -30,6 +30,7 @@ |
| #include "atomicops.h" |
| #include "flags.h" |
| +#include "list.h" |
| #include "platform.h" |
| #include "platform/mutex.h" |
| #include "platform/time.h" |
| @@ -51,7 +52,11 @@ class OptimizingCompilerThread : public Thread { |
| #endif |
| isolate_(isolate), |
| stop_semaphore_(OS::CreateSemaphore(0)), |
| - input_queue_semaphore_(OS::CreateSemaphore(0)) { |
| + input_queue_semaphore_(OS::CreateSemaphore(0)), |
| + osr_candidates_(2), |
|
titzer
2013/09/04 09:23:23
Why not kReadyForOSRLimit?
Yang
2013/09/04 12:55:12
Done.
|
| + ready_for_osr_(2), |
| + osr_hits_(0), |
| + osr_attempts_(0) { |
| NoBarrier_Store(&stop_thread_, static_cast<AtomicWord>(CONTINUE)); |
| NoBarrier_Store(&queue_length_, static_cast<AtomicWord>(0)); |
| } |
| @@ -61,6 +66,13 @@ class OptimizingCompilerThread : public Thread { |
| void Flush(); |
| void QueueForOptimization(OptimizingCompiler* optimizing_compiler); |
| void InstallOptimizedFunctions(); |
| + OptimizingCompiler* FindReadyOSRCandidate(Handle<JSFunction> function, |
| + uint32_t osr_pc_offset); |
| + bool IsQueuedForOSR(Handle<JSFunction> function, uint32_t osr_pc_offset); |
| + |
| + // Remove the oldest OSR candidates that are ready so that we |
| + // only have |limit| left waiting. |
| + void RemoveStaleOSRCandidates(int limit = kReadyForOSRLimit); |
| inline bool IsQueueAvailable() { |
| // We don't need a barrier since we have a data dependency right |
| @@ -92,7 +104,6 @@ class OptimizingCompilerThread : public Thread { |
| void FlushInputQueue(bool restore_function_code); |
| void FlushOutputQueue(bool restore_function_code); |
| - |
| void CompileNext(); |
| #ifdef DEBUG |
| @@ -103,13 +114,27 @@ class OptimizingCompilerThread : public Thread { |
| Isolate* isolate_; |
| Semaphore* stop_semaphore_; |
| Semaphore* input_queue_semaphore_; |
| + |
| + // Queue of incoming recompilation tasks (including OSR). |
| UnboundQueue<OptimizingCompiler*> input_queue_; |
| + // Queue of recompilation tasks ready to be installed (excluding OSR). |
| UnboundQueue<OptimizingCompiler*> output_queue_; |
| + // List of all OSR related recompilation tasks (both incoming and ready ones). |
| + List<OptimizingCompiler*> osr_candidates_; |
| + // List of recompilation tasks ready for OSR. |
| + List<OptimizingCompiler*> ready_for_osr_; |
| + |
| Mutex install_mutex_; |
| volatile AtomicWord stop_thread_; |
| volatile Atomic32 queue_length_; |
| TimeDelta time_spent_compiling_; |
| TimeDelta time_spent_total_; |
| + |
| + Mutex osr_list_mutex_; |
| + int osr_hits_; |
| + int osr_attempts_; |
| + |
| + static const int kReadyForOSRLimit = 4; |
| }; |
| } } // namespace v8::internal |