| 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 "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "tools/gn/standard_out.h" | 10 #include "tools/gn/standard_out.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 } | 36 } |
| 37 | 37 |
| 38 Scheduler::~Scheduler() { | 38 Scheduler::~Scheduler() { |
| 39 if (!has_been_shutdown_) | 39 if (!has_been_shutdown_) |
| 40 pool_->Shutdown(); | 40 pool_->Shutdown(); |
| 41 g_scheduler = NULL; | 41 g_scheduler = NULL; |
| 42 } | 42 } |
| 43 | 43 |
| 44 bool Scheduler::Run() { | 44 bool Scheduler::Run() { |
| 45 runner_.Run(); | 45 runner_.Run(); |
| 46 base::AutoLock lock(lock_); | 46 bool local_is_failed; |
| 47 { |
| 48 base::AutoLock lock(lock_); |
| 49 local_is_failed = is_failed(); |
| 50 has_been_shutdown_ = true; |
| 51 } |
| 52 // Don't do this inside the lock since it will block on the workers, which |
| 53 // may be in turn waiting on the lock. |
| 47 pool_->Shutdown(); | 54 pool_->Shutdown(); |
| 48 has_been_shutdown_ = true; | 55 return !local_is_failed; |
| 49 return !is_failed(); | |
| 50 } | 56 } |
| 51 | 57 |
| 52 void Scheduler::Log(const std::string& verb, const std::string& msg) { | 58 void Scheduler::Log(const std::string& verb, const std::string& msg) { |
| 53 if (base::MessageLoop::current() == &main_loop_) { | 59 if (base::MessageLoop::current() == &main_loop_) { |
| 54 LogOnMainThread(verb, msg); | 60 LogOnMainThread(verb, msg); |
| 55 } else { | 61 } else { |
| 56 // The run loop always joins on the sub threads, so the lifetime of this | 62 // The run loop always joins on the sub threads, so the lifetime of this |
| 57 // object outlives the invocations of this function, hence "unretained". | 63 // object outlives the invocations of this function, hence "unretained". |
| 58 main_loop_.PostTask(FROM_HERE, | 64 main_loop_.PostTask(FROM_HERE, |
| 59 base::Bind(&Scheduler::LogOnMainThread, | 65 base::Bind(&Scheduler::LogOnMainThread, |
| 60 base::Unretained(this), verb, msg)); | 66 base::Unretained(this), verb, msg)); |
| 61 } | 67 } |
| 62 } | 68 } |
| 63 | 69 |
| 64 void Scheduler::FailWithError(const Err& err) { | 70 void Scheduler::FailWithError(const Err& err) { |
| 65 DCHECK(err.has_error()); | 71 DCHECK(err.has_error()); |
| 66 { | 72 { |
| 67 base::AutoLock lock(lock_); | 73 base::AutoLock lock(lock_); |
| 68 | 74 |
| 69 if (is_failed_) | 75 if (is_failed_ || has_been_shutdown_) |
| 70 return; // Ignore errors once we see one. | 76 return; // Ignore errors once we see one. |
| 71 is_failed_ = true; | 77 is_failed_ = true; |
| 72 } | 78 } |
| 73 | 79 |
| 74 if (base::MessageLoop::current() == &main_loop_) { | 80 if (base::MessageLoop::current() == &main_loop_) { |
| 75 FailWithErrorOnMainThread(err); | 81 FailWithErrorOnMainThread(err); |
| 76 } else { | 82 } else { |
| 77 // The run loop always joins on the sub threads, so the lifetime of this | 83 // The run loop always joins on the sub threads, so the lifetime of this |
| 78 // object outlives the invocations of this function, hence "unretained". | 84 // object outlives the invocations of this function, hence "unretained". |
| 79 main_loop_.PostTask(FROM_HERE, | 85 main_loop_.PostTask(FROM_HERE, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 void Scheduler::DoWork(const base::Closure& closure) { | 136 void Scheduler::DoWork(const base::Closure& closure) { |
| 131 closure.Run(); | 137 closure.Run(); |
| 132 DecrementWorkCount(); | 138 DecrementWorkCount(); |
| 133 } | 139 } |
| 134 | 140 |
| 135 void Scheduler::OnComplete() { | 141 void Scheduler::OnComplete() { |
| 136 // Should be called on the main thread. | 142 // Should be called on the main thread. |
| 137 DCHECK(base::MessageLoop::current() == main_loop()); | 143 DCHECK(base::MessageLoop::current() == main_loop()); |
| 138 runner_.Quit(); | 144 runner_.Quit(); |
| 139 } | 145 } |
| OLD | NEW |