Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Side by Side Diff: base/threading/worker_pool_posix.cc

Issue 1044413002: Record async "task backtraces" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/pending_task.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/threading/worker_pool_posix.h" 5 #include "base/threading/worker_pool_posix.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 AutoLock locked(lock_); 133 AutoLock locked(lock_);
134 DCHECK(!terminated_) << "Thread pool is already terminated."; 134 DCHECK(!terminated_) << "Thread pool is already terminated.";
135 terminated_ = true; 135 terminated_ = true;
136 } 136 }
137 pending_tasks_available_cv_.Broadcast(); 137 pending_tasks_available_cv_.Broadcast();
138 } 138 }
139 139
140 void PosixDynamicThreadPool::PostTask( 140 void PosixDynamicThreadPool::PostTask(
141 const tracked_objects::Location& from_here, 141 const tracked_objects::Location& from_here,
142 const base::Closure& task) { 142 const base::Closure& task) {
143 PendingTask pending_task(from_here, task); 143 PendingTask pending_task(from_here,
144 MessageLoop::current()->current_pending_task_,
danakj 2015/04/03 17:18:35 The use of MessageLoop::current()->current_pending
145 task);
144 AddTask(&pending_task); 146 AddTask(&pending_task);
145 } 147 }
146 148
147 void PosixDynamicThreadPool::AddTask(PendingTask* pending_task) { 149 void PosixDynamicThreadPool::AddTask(PendingTask* pending_task) {
148 AutoLock locked(lock_); 150 AutoLock locked(lock_);
149 DCHECK(!terminated_) << 151 DCHECK(!terminated_) <<
150 "This thread pool is already terminated. Do not post new tasks."; 152 "This thread pool is already terminated. Do not post new tasks.";
151 153
152 pending_tasks_.push(*pending_task); 154 pending_tasks_.push(*pending_task);
153 pending_task->task.Reset(); 155 pending_task->task.Reset();
154 156
155 // We have enough worker threads. 157 // We have enough worker threads.
156 if (static_cast<size_t>(num_idle_threads_) >= pending_tasks_.size()) { 158 if (static_cast<size_t>(num_idle_threads_) >= pending_tasks_.size()) {
157 pending_tasks_available_cv_.Signal(); 159 pending_tasks_available_cv_.Signal();
158 } else { 160 } else {
159 // The new PlatformThread will take ownership of the WorkerThread object, 161 // The new PlatformThread will take ownership of the WorkerThread object,
160 // which will delete itself on exit. 162 // which will delete itself on exit.
161 WorkerThread* worker = 163 WorkerThread* worker =
162 new WorkerThread(name_prefix_, this); 164 new WorkerThread(name_prefix_, this);
163 PlatformThread::CreateNonJoinable(0, worker); 165 PlatformThread::CreateNonJoinable(0, worker);
164 } 166 }
165 } 167 }
166 168
167 PendingTask PosixDynamicThreadPool::WaitForTask() { 169 PendingTask PosixDynamicThreadPool::WaitForTask() {
168 AutoLock locked(lock_); 170 AutoLock locked(lock_);
169 171
170 if (terminated_) 172 if (terminated_)
171 return PendingTask(FROM_HERE, base::Closure()); 173 return PendingTask(FROM_HERE, NULL, base::Closure());
172 174
173 if (pending_tasks_.empty()) { // No work available, wait for work. 175 if (pending_tasks_.empty()) { // No work available, wait for work.
174 num_idle_threads_++; 176 num_idle_threads_++;
175 if (num_idle_threads_cv_.get()) 177 if (num_idle_threads_cv_.get())
176 num_idle_threads_cv_->Signal(); 178 num_idle_threads_cv_->Signal();
177 pending_tasks_available_cv_.TimedWait( 179 pending_tasks_available_cv_.TimedWait(
178 TimeDelta::FromSeconds(idle_seconds_before_exit_)); 180 TimeDelta::FromSeconds(idle_seconds_before_exit_));
179 num_idle_threads_--; 181 num_idle_threads_--;
180 if (num_idle_threads_cv_.get()) 182 if (num_idle_threads_cv_.get())
181 num_idle_threads_cv_->Signal(); 183 num_idle_threads_cv_->Signal();
182 if (pending_tasks_.empty()) { 184 if (pending_tasks_.empty()) {
183 // We waited for work, but there's still no work. Return NULL to signal 185 // We waited for work, but there's still no work. Return NULL to signal
184 // the thread to terminate. 186 // the thread to terminate.
185 return PendingTask(FROM_HERE, base::Closure()); 187 return PendingTask(FROM_HERE, NULL, base::Closure());
186 } 188 }
187 } 189 }
188 190
189 PendingTask pending_task = pending_tasks_.front(); 191 PendingTask pending_task = pending_tasks_.front();
190 pending_tasks_.pop(); 192 pending_tasks_.pop();
191 return pending_task; 193 return pending_task;
192 } 194 }
193 195
194 } // namespace base 196 } // namespace base
OLDNEW
« no previous file with comments | « base/pending_task.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698