| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 101   Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1)); | 101   Barrier_AtomicIncrement(&queue_length_, static_cast<Atomic32>(-1)); | 
| 102 | 102 | 
| 103   // The function may have already been optimized by OSR.  Simply continue. | 103   // The function may have already been optimized by OSR.  Simply continue. | 
| 104   RecompileJob::Status status = job->OptimizeGraph(); | 104   RecompileJob::Status status = job->OptimizeGraph(); | 
| 105   USE(status);   // Prevent an unused-variable error in release mode. | 105   USE(status);   // Prevent an unused-variable error in release mode. | 
| 106   ASSERT(status != RecompileJob::FAILED); | 106   ASSERT(status != RecompileJob::FAILED); | 
| 107 | 107 | 
| 108   // The function may have already been optimized by OSR.  Simply continue. | 108   // The function may have already been optimized by OSR.  Simply continue. | 
| 109   // Use a mutex to make sure that functions marked for install | 109   // Use a mutex to make sure that functions marked for install | 
| 110   // are always also queued. | 110   // are always also queued. | 
| 111   LockGuard<Mutex> access_queue(&queue_mutex_); |  | 
| 112   output_queue_.Enqueue(job); | 111   output_queue_.Enqueue(job); | 
| 113   isolate_->stack_guard()->RequestInstallCode(); | 112   isolate_->stack_guard()->RequestInstallCode(); | 
| 114 } | 113 } | 
| 115 | 114 | 
| 116 | 115 | 
| 117 static void DisposeRecompileJob(RecompileJob* job, | 116 static void DisposeRecompileJob(RecompileJob* job, | 
| 118                                 bool restore_function_code) { | 117                                 bool restore_function_code) { | 
| 119   // The recompile job is allocated in the CompilationInfo's zone. | 118   // The recompile job is allocated in the CompilationInfo's zone. | 
| 120   CompilationInfo* info = job->info(); | 119   CompilationInfo* info = job->info(); | 
| 121   if (restore_function_code) { | 120   if (restore_function_code) { | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 140     if (!job->info()->is_osr()) { | 139     if (!job->info()->is_osr()) { | 
| 141       DisposeRecompileJob(job, restore_function_code); | 140       DisposeRecompileJob(job, restore_function_code); | 
| 142     } | 141     } | 
| 143   } | 142   } | 
| 144   Release_Store(&queue_length_, static_cast<AtomicWord>(0)); | 143   Release_Store(&queue_length_, static_cast<AtomicWord>(0)); | 
| 145 } | 144 } | 
| 146 | 145 | 
| 147 | 146 | 
| 148 void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { | 147 void OptimizingCompilerThread::FlushOutputQueue(bool restore_function_code) { | 
| 149   RecompileJob* job; | 148   RecompileJob* job; | 
| 150   while (true) { | 149   while (output_queue_.Dequeue(&job)) { | 
| 151     { LockGuard<Mutex> access_queue(&queue_mutex_); |  | 
| 152       if (!output_queue_.Dequeue(&job)) break; |  | 
| 153     } |  | 
| 154     // OSR jobs are dealt with separately. | 150     // OSR jobs are dealt with separately. | 
| 155     if (!job->info()->is_osr()) { | 151     if (!job->info()->is_osr()) { | 
| 156       DisposeRecompileJob(job, restore_function_code); | 152       DisposeRecompileJob(job, restore_function_code); | 
| 157     } | 153     } | 
| 158   } | 154   } | 
| 159 } | 155 } | 
| 160 | 156 | 
| 161 | 157 | 
| 162 void OptimizingCompilerThread::FlushOsrBuffer(bool restore_function_code) { | 158 void OptimizingCompilerThread::FlushOsrBuffer(bool restore_function_code) { | 
| 163   RecompileJob* job; | 159   RecompileJob* job; | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 213 | 209 | 
| 214   Join(); | 210   Join(); | 
| 215 } | 211 } | 
| 216 | 212 | 
| 217 | 213 | 
| 218 void OptimizingCompilerThread::InstallOptimizedFunctions() { | 214 void OptimizingCompilerThread::InstallOptimizedFunctions() { | 
| 219   ASSERT(!IsOptimizerThread()); | 215   ASSERT(!IsOptimizerThread()); | 
| 220   HandleScope handle_scope(isolate_); | 216   HandleScope handle_scope(isolate_); | 
| 221 | 217 | 
| 222   RecompileJob* job; | 218   RecompileJob* job; | 
| 223   while (true) { | 219   while (output_queue_.Dequeue(&job)) { | 
| 224     { LockGuard<Mutex> access_queue(&queue_mutex_); |  | 
| 225       if (!output_queue_.Dequeue(&job)) break; |  | 
| 226     } |  | 
| 227     CompilationInfo* info = job->info(); | 220     CompilationInfo* info = job->info(); | 
| 228     if (info->is_osr()) { | 221     if (info->is_osr()) { | 
| 229       if (FLAG_trace_osr) { | 222       if (FLAG_trace_osr) { | 
| 230         PrintF("[COSR - "); | 223         PrintF("[COSR - "); | 
| 231         info->closure()->PrintName(); | 224         info->closure()->PrintName(); | 
| 232         PrintF(" is ready for install and entry at AST id %d]\n", | 225         PrintF(" is ready for install and entry at AST id %d]\n", | 
| 233                info->osr_ast_id().ToInt()); | 226                info->osr_ast_id().ToInt()); | 
| 234       } | 227       } | 
| 235       job->WaitForInstall(); | 228       job->WaitForInstall(); | 
| 236       BackEdgeTable::RemoveStackCheck(info); | 229       BackEdgeTable::RemoveStackCheck(info); | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 335 #ifdef DEBUG | 328 #ifdef DEBUG | 
| 336 bool OptimizingCompilerThread::IsOptimizerThread() { | 329 bool OptimizingCompilerThread::IsOptimizerThread() { | 
| 337   if (!FLAG_concurrent_recompilation) return false; | 330   if (!FLAG_concurrent_recompilation) return false; | 
| 338   LockGuard<Mutex> lock_guard(&thread_id_mutex_); | 331   LockGuard<Mutex> lock_guard(&thread_id_mutex_); | 
| 339   return ThreadId::Current().ToInteger() == thread_id_; | 332   return ThreadId::Current().ToInteger() == thread_id_; | 
| 340 } | 333 } | 
| 341 #endif | 334 #endif | 
| 342 | 335 | 
| 343 | 336 | 
| 344 } }  // namespace v8::internal | 337 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|