| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "tools/gn/scheduler.h" | 5 #include "tools/gn/scheduler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/single_thread_task_runner.h" |
| 11 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 12 #include "build/build_config.h" | 13 #include "build/build_config.h" |
| 13 #include "tools/gn/standard_out.h" | 14 #include "tools/gn/standard_out.h" |
| 14 #include "tools/gn/switches.h" | 15 #include "tools/gn/switches.h" |
| 15 #include "tools/gn/target.h" | 16 #include "tools/gn/target.h" |
| 16 | 17 |
| 17 #if defined(OS_WIN) | 18 #if defined(OS_WIN) |
| 18 #include <windows.h> | 19 #include <windows.h> |
| 19 #else | 20 #else |
| 20 #include <unistd.h> | 21 #include <unistd.h> |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 pool_->Shutdown(); | 95 pool_->Shutdown(); |
| 95 return !local_is_failed; | 96 return !local_is_failed; |
| 96 } | 97 } |
| 97 | 98 |
| 98 void Scheduler::Log(const std::string& verb, const std::string& msg) { | 99 void Scheduler::Log(const std::string& verb, const std::string& msg) { |
| 99 if (base::MessageLoop::current() == &main_loop_) { | 100 if (base::MessageLoop::current() == &main_loop_) { |
| 100 LogOnMainThread(verb, msg); | 101 LogOnMainThread(verb, msg); |
| 101 } else { | 102 } else { |
| 102 // The run loop always joins on the sub threads, so the lifetime of this | 103 // The run loop always joins on the sub threads, so the lifetime of this |
| 103 // object outlives the invocations of this function, hence "unretained". | 104 // object outlives the invocations of this function, hence "unretained". |
| 104 main_loop_.PostTask(FROM_HERE, | 105 main_loop_.task_runner()->PostTask( |
| 105 base::Bind(&Scheduler::LogOnMainThread, | 106 FROM_HERE, base::Bind(&Scheduler::LogOnMainThread, |
| 106 base::Unretained(this), verb, msg)); | 107 base::Unretained(this), verb, msg)); |
| 107 } | 108 } |
| 108 } | 109 } |
| 109 | 110 |
| 110 void Scheduler::FailWithError(const Err& err) { | 111 void Scheduler::FailWithError(const Err& err) { |
| 111 DCHECK(err.has_error()); | 112 DCHECK(err.has_error()); |
| 112 { | 113 { |
| 113 base::AutoLock lock(lock_); | 114 base::AutoLock lock(lock_); |
| 114 | 115 |
| 115 if (is_failed_ || has_been_shutdown_) | 116 if (is_failed_ || has_been_shutdown_) |
| 116 return; // Ignore errors once we see one. | 117 return; // Ignore errors once we see one. |
| 117 is_failed_ = true; | 118 is_failed_ = true; |
| 118 } | 119 } |
| 119 | 120 |
| 120 if (base::MessageLoop::current() == &main_loop_) { | 121 if (base::MessageLoop::current() == &main_loop_) { |
| 121 FailWithErrorOnMainThread(err); | 122 FailWithErrorOnMainThread(err); |
| 122 } else { | 123 } else { |
| 123 // The run loop always joins on the sub threads, so the lifetime of this | 124 // The run loop always joins on the sub threads, so the lifetime of this |
| 124 // object outlives the invocations of this function, hence "unretained". | 125 // object outlives the invocations of this function, hence "unretained". |
| 125 main_loop_.PostTask(FROM_HERE, | 126 main_loop_.task_runner()->PostTask( |
| 126 base::Bind(&Scheduler::FailWithErrorOnMainThread, | 127 FROM_HERE, base::Bind(&Scheduler::FailWithErrorOnMainThread, |
| 127 base::Unretained(this), err)); | 128 base::Unretained(this), err)); |
| 128 } | 129 } |
| 129 } | 130 } |
| 130 | 131 |
| 131 void Scheduler::ScheduleWork(const base::Closure& work) { | 132 void Scheduler::ScheduleWork(const base::Closure& work) { |
| 132 IncrementWorkCount(); | 133 IncrementWorkCount(); |
| 133 pool_->PostWorkerTaskWithShutdownBehavior( | 134 pool_->PostWorkerTaskWithShutdownBehavior( |
| 134 FROM_HERE, base::Bind(&Scheduler::DoWork, | 135 FROM_HERE, base::Bind(&Scheduler::DoWork, |
| 135 base::Unretained(this), work), | 136 base::Unretained(this), work), |
| 136 base::SequencedWorkerPool::BLOCK_SHUTDOWN); | 137 base::SequencedWorkerPool::BLOCK_SHUTDOWN); |
| 137 } | 138 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 | 204 |
| 204 void Scheduler::IncrementWorkCount() { | 205 void Scheduler::IncrementWorkCount() { |
| 205 base::AtomicRefCountInc(&work_count_); | 206 base::AtomicRefCountInc(&work_count_); |
| 206 } | 207 } |
| 207 | 208 |
| 208 void Scheduler::DecrementWorkCount() { | 209 void Scheduler::DecrementWorkCount() { |
| 209 if (!base::AtomicRefCountDec(&work_count_)) { | 210 if (!base::AtomicRefCountDec(&work_count_)) { |
| 210 if (base::MessageLoop::current() == &main_loop_) { | 211 if (base::MessageLoop::current() == &main_loop_) { |
| 211 OnComplete(); | 212 OnComplete(); |
| 212 } else { | 213 } else { |
| 213 main_loop_.PostTask(FROM_HERE, | 214 main_loop_.task_runner()->PostTask( |
| 214 base::Bind(&Scheduler::OnComplete, | 215 FROM_HERE, |
| 215 base::Unretained(this))); | 216 base::Bind(&Scheduler::OnComplete, base::Unretained(this))); |
| 216 } | 217 } |
| 217 } | 218 } |
| 218 } | 219 } |
| 219 | 220 |
| 220 void Scheduler::LogOnMainThread(const std::string& verb, | 221 void Scheduler::LogOnMainThread(const std::string& verb, |
| 221 const std::string& msg) { | 222 const std::string& msg) { |
| 222 OutputString(verb, DECORATION_YELLOW); | 223 OutputString(verb, DECORATION_YELLOW); |
| 223 OutputString(" " + msg + "\n"); | 224 OutputString(" " + msg + "\n"); |
| 224 } | 225 } |
| 225 | 226 |
| 226 void Scheduler::FailWithErrorOnMainThread(const Err& err) { | 227 void Scheduler::FailWithErrorOnMainThread(const Err& err) { |
| 227 err.PrintToStdout(); | 228 err.PrintToStdout(); |
| 228 runner_.Quit(); | 229 runner_.Quit(); |
| 229 } | 230 } |
| 230 | 231 |
| 231 void Scheduler::DoWork(const base::Closure& closure) { | 232 void Scheduler::DoWork(const base::Closure& closure) { |
| 232 closure.Run(); | 233 closure.Run(); |
| 233 DecrementWorkCount(); | 234 DecrementWorkCount(); |
| 234 } | 235 } |
| 235 | 236 |
| 236 void Scheduler::OnComplete() { | 237 void Scheduler::OnComplete() { |
| 237 // Should be called on the main thread. | 238 // Should be called on the main thread. |
| 238 DCHECK(base::MessageLoop::current() == main_loop()); | 239 DCHECK(base::MessageLoop::current() == main_loop()); |
| 239 runner_.Quit(); | 240 runner_.Quit(); |
| 240 } | 241 } |
| OLD | NEW |