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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc

Issue 2464853002: Add crash keys to TaskQueueManager::ProcessTaskFromWorkQueue (Closed)
Patch Set: Added missing periods Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "platform/scheduler/base/task_queue_manager.h" 5 #include "platform/scheduler/base/task_queue_manager.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/debug/crash_logging.h"
11 #include "base/metrics/histogram_macros.h" 12 #include "base/metrics/histogram_macros.h"
12 #include "base/trace_event/trace_event.h" 13 #include "base/trace_event/trace_event.h"
13 #include "platform/scheduler/base/real_time_domain.h" 14 #include "platform/scheduler/base/real_time_domain.h"
14 #include "platform/scheduler/base/task_queue_impl.h" 15 #include "platform/scheduler/base/task_queue_impl.h"
15 #include "platform/scheduler/base/task_queue_manager_delegate.h" 16 #include "platform/scheduler/base/task_queue_manager_delegate.h"
16 #include "platform/scheduler/base/task_queue_selector.h" 17 #include "platform/scheduler/base/task_queue_selector.h"
17 #include "platform/scheduler/base/work_queue.h" 18 #include "platform/scheduler/base/work_queue.h"
18 #include "platform/scheduler/base/work_queue_sets.h" 19 #include "platform/scheduler/base/work_queue_sets.h"
19 #include "public/platform/scheduler/base/task_time_observer.h" 20 #include "public/platform/scheduler/base/task_time_observer.h"
20 21
(...skipping 26 matching lines...) Expand all
47 base::OnceClosure cb) { 48 base::OnceClosure cb) {
48 return base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); }, 49 return base::BindRepeating([](base::OnceClosure cb) { std::move(cb).Run(); },
49 base::Passed(&cb)); 50 base::Passed(&cb));
50 } 51 }
51 } 52 }
52 53
53 TaskQueueManager::TaskQueueManager( 54 TaskQueueManager::TaskQueueManager(
54 scoped_refptr<TaskQueueManagerDelegate> delegate, 55 scoped_refptr<TaskQueueManagerDelegate> delegate,
55 const char* tracing_category, 56 const char* tracing_category,
56 const char* disabled_by_default_tracing_category, 57 const char* disabled_by_default_tracing_category,
57 const char* disabled_by_default_verbose_tracing_category) 58 const char* disabled_by_default_verbose_tracing_category,
59 bool set_crash_keys)
58 : real_time_domain_(new RealTimeDomain(tracing_category)), 60 : real_time_domain_(new RealTimeDomain(tracing_category)),
59 delegate_(delegate), 61 delegate_(delegate),
60 task_was_run_on_quiescence_monitored_queue_(false), 62 task_was_run_on_quiescence_monitored_queue_(false),
61 other_thread_pending_wakeup_(false), 63 other_thread_pending_wakeup_(false),
64 set_crash_keys_(set_crash_keys),
62 work_batch_size_(1), 65 work_batch_size_(1),
63 task_count_(0), 66 task_count_(0),
64 tracing_category_(tracing_category), 67 tracing_category_(tracing_category),
65 disabled_by_default_tracing_category_( 68 disabled_by_default_tracing_category_(
66 disabled_by_default_tracing_category), 69 disabled_by_default_tracing_category),
67 disabled_by_default_verbose_tracing_category_( 70 disabled_by_default_verbose_tracing_category_(
68 disabled_by_default_verbose_tracing_category), 71 disabled_by_default_verbose_tracing_category),
69 currently_executing_task_queue_(nullptr), 72 currently_executing_task_queue_(nullptr),
70 observer_(nullptr), 73 observer_(nullptr),
71 deletion_sentinel_(new DeletionSentinel()), 74 deletion_sentinel_(new DeletionSentinel()),
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task); 313 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task);
311 } 314 }
312 315
313 TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue( 316 TaskQueueManager::ProcessTaskResult TaskQueueManager::ProcessTaskFromWorkQueue(
314 internal::WorkQueue* work_queue) { 317 internal::WorkQueue* work_queue) {
315 DCHECK(main_thread_checker_.CalledOnValidThread()); 318 DCHECK(main_thread_checker_.CalledOnValidThread());
316 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); 319 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_);
317 internal::TaskQueueImpl::Task pending_task = 320 internal::TaskQueueImpl::Task pending_task =
318 work_queue->TakeTaskFromWorkQueue(); 321 work_queue->TakeTaskFromWorkQueue();
319 322
323 // Temporary for https://crbug.com/660427
324 CHECK(!pending_task.task.is_null()) << "Posted from "
325 << pending_task.posted_from.ToString();
326
320 // It's possible the task was canceled, if so bail out. 327 // It's possible the task was canceled, if so bail out.
321 if (pending_task.task.IsCancelled()) 328 if (pending_task.task.IsCancelled())
322 return ProcessTaskResult::EXECUTED; 329 return ProcessTaskResult::EXECUTED;
323 330
324 internal::TaskQueueImpl* queue = work_queue->task_queue(); 331 internal::TaskQueueImpl* queue = work_queue->task_queue();
325 if (queue->GetQuiescenceMonitored()) 332 if (queue->GetQuiescenceMonitored())
326 task_was_run_on_quiescence_monitored_queue_ = true; 333 task_was_run_on_quiescence_monitored_queue_ = true;
327 334
335 static const char kBlinkSchedulerTaskFunctionNameKey[] =
336 "blink_scheduler_task_function_name";
337 static const char kBlinkSchedulerTaskFileNameKey[] =
338 "blink_scheduler_task_file_name";
339
340 bool is_nested = delegate_->IsNested();
341 if (!is_nested && set_crash_keys_) {
342 base::debug::SetCrashKeyValue(kBlinkSchedulerTaskFunctionNameKey,
343 pending_task.posted_from.file_name());
344 base::debug::SetCrashKeyValue(kBlinkSchedulerTaskFileNameKey,
345 pending_task.posted_from.function_name());
346 }
347
328 if (!pending_task.nestable && delegate_->IsNested()) { 348 if (!pending_task.nestable && delegate_->IsNested()) {
329 // Defer non-nestable work to the main task runner. NOTE these tasks can be 349 // Defer non-nestable work to the main task runner. NOTE these tasks can be
330 // arbitrarily delayed so the additional delay should not be a problem. 350 // arbitrarily delayed so the additional delay should not be a problem.
331 // TODO(skyostil): Figure out a way to not forget which task queue the 351 // TODO(skyostil): Figure out a way to not forget which task queue the
332 // task is associated with. See http://crbug.com/522843. 352 // task is associated with. See http://crbug.com/522843.
333 // TODO(tzik): Remove base::UnsafeConvertOnceClosureToRepeating once 353 // TODO(tzik): Remove base::UnsafeConvertOnceClosureToRepeating once
334 // TaskRunners have migrated to OnceClosure. 354 // TaskRunners have migrated to OnceClosure.
335 delegate_->PostNonNestableTask( 355 delegate_->PostNonNestableTask(
336 pending_task.posted_from, 356 pending_task.posted_from,
337 UnsafeConvertOnceClosureToRepeating(std::move(pending_task.task))); 357 UnsafeConvertOnceClosureToRepeating(std::move(pending_task.task)));
(...skipping 11 matching lines...) Expand all
349 } 369 }
350 TRACE_EVENT1(tracing_category_, "TaskQueueManager::RunTask", "queue", 370 TRACE_EVENT1(tracing_category_, "TaskQueueManager::RunTask", "queue",
351 queue->GetName()); 371 queue->GetName());
352 // NOTE when TaskQueues get unregistered a reference ends up getting retained 372 // NOTE when TaskQueues get unregistered a reference ends up getting retained
353 // by |queues_to_delete_| which is cleared at the top of |DoWork|. This means 373 // by |queues_to_delete_| which is cleared at the top of |DoWork|. This means
354 // we are OK to use raw pointers here. 374 // we are OK to use raw pointers here.
355 internal::TaskQueueImpl* prev_executing_task_queue = 375 internal::TaskQueueImpl* prev_executing_task_queue =
356 currently_executing_task_queue_; 376 currently_executing_task_queue_;
357 currently_executing_task_queue_ = queue; 377 currently_executing_task_queue_ = queue;
358 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); 378 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task);
379
359 // Detect if the TaskQueueManager just got deleted. If this happens we must 380 // Detect if the TaskQueueManager just got deleted. If this happens we must
360 // not access any member variables after this point. 381 // not access any member variables after this point.
361 if (protect->HasOneRef()) 382 if (protect->HasOneRef())
362 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; 383 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED;
363 384
385 if (!is_nested && set_crash_keys_) {
386 base::debug::ClearCrashKey(kBlinkSchedulerTaskFunctionNameKey);
387 base::debug::ClearCrashKey(kBlinkSchedulerTaskFileNameKey);
388 }
389
364 currently_executing_task_queue_ = prev_executing_task_queue; 390 currently_executing_task_queue_ = prev_executing_task_queue;
365 391
366 if (queue->GetShouldNotifyObservers()) { 392 if (queue->GetShouldNotifyObservers()) {
367 for (auto& observer : task_observers_) 393 for (auto& observer : task_observers_)
368 observer.DidProcessTask(pending_task); 394 observer.DidProcessTask(pending_task);
369 queue->NotifyDidProcessTask(pending_task); 395 queue->NotifyDidProcessTask(pending_task);
370 } 396 }
371 397
372 return ProcessTaskResult::EXECUTED; 398 return ProcessTaskResult::EXECUTED;
373 } 399 }
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 *work_queue->GetFrontTask()); 516 *work_queue->GetFrontTask());
491 } 517 }
492 } 518 }
493 519
494 bool TaskQueueManager::HasImmediateWorkForTesting() const { 520 bool TaskQueueManager::HasImmediateWorkForTesting() const {
495 return !selector_.EnabledWorkQueuesEmpty(); 521 return !selector_.EnabledWorkQueuesEmpty();
496 } 522 }
497 523
498 } // namespace scheduler 524 } // namespace scheduler
499 } // namespace blink 525 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698