// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/task/post_task.h" #include #include "base/logging.h" #include "base/task/scoped_set_task_priority_for_current_thread.h" #include "base/task/task_scheduler/task_scheduler.h" #include "base/threading/post_task_and_reply_impl.h" namespace base { namespace { class PostTaskAndReplyWithTraitsTaskRunner : public internal::PostTaskAndReplyImpl { public: explicit PostTaskAndReplyWithTraitsTaskRunner(const TaskTraits& traits) : traits_(traits) {} private: bool PostTask(const Location& from_here, OnceClosure task) override { PostTaskWithTraits(from_here, traits_, std::move(task)); return true; } const TaskTraits traits_; }; // Returns TaskTraits based on |traits|. If TaskPriority hasn't been set // explicitly in |traits|, the returned TaskTraits have the current // TaskPriority. TaskTraits GetTaskTraitsWithExplicitPriority(const TaskTraits& traits) { if (traits.priority_set_explicitly()) return traits; return TaskTraits::Override(traits, {internal::GetTaskPriorityForCurrentThread()}); } } // namespace void PostTask(const Location& from_here, OnceClosure task) { PostDelayedTask(from_here, std::move(task), TimeDelta()); } void PostDelayedTask(const Location& from_here, OnceClosure task, TimeDelta delay) { PostDelayedTaskWithTraits(from_here, TaskTraits(), std::move(task), delay); } void PostTaskAndReply(const Location& from_here, OnceClosure task, OnceClosure reply) { PostTaskWithTraitsAndReply(from_here, TaskTraits(), std::move(task), std::move(reply)); } void PostTaskWithTraits(const Location& from_here, const TaskTraits& traits, OnceClosure task) { PostDelayedTaskWithTraits(from_here, traits, std::move(task), TimeDelta()); } void PostDelayedTaskWithTraits(const Location& from_here, const TaskTraits& traits, OnceClosure task, TimeDelta delay) { DCHECK(TaskScheduler::GetInstance()) << "Ref. Prerequisite section of post_task.h.\n\n" "Hint: if this is in a unit test, you're likely merely missing a " "base::test::ScopedTaskEnvironment member in your fixture.\n"; TaskScheduler::GetInstance()->PostDelayedTaskWithTraits( from_here, GetTaskTraitsWithExplicitPriority(traits), std::move(task), std::move(delay)); } void PostTaskWithTraitsAndReply(const Location& from_here, const TaskTraits& traits, OnceClosure task, OnceClosure reply) { PostTaskAndReplyWithTraitsTaskRunner(traits).PostTaskAndReply( from_here, std::move(task), std::move(reply)); } scoped_refptr CreateTaskRunnerWithTraits(const TaskTraits& traits) { DCHECK(TaskScheduler::GetInstance()) << "Ref. Prerequisite section of post_task.h.\n\n" "Hint: if this is in a unit test, you're likely merely missing a " "base::test::ScopedTaskEnvironment member in your fixture.\n"; return TaskScheduler::GetInstance()->CreateTaskRunnerWithTraits( GetTaskTraitsWithExplicitPriority(traits)); } scoped_refptr CreateSequencedTaskRunnerWithTraits( const TaskTraits& traits) { DCHECK(TaskScheduler::GetInstance()) << "Ref. Prerequisite section of post_task.h.\n\n" "Hint: if this is in a unit test, you're likely merely missing a " "base::test::ScopedTaskEnvironment member in your fixture.\n"; return TaskScheduler::GetInstance()->CreateSequencedTaskRunnerWithTraits( GetTaskTraitsWithExplicitPriority(traits)); } scoped_refptr CreateSingleThreadTaskRunnerWithTraits( const TaskTraits& traits, SingleThreadTaskRunnerThreadMode thread_mode) { DCHECK(TaskScheduler::GetInstance()) << "Ref. Prerequisite section of post_task.h.\n\n" "Hint: if this is in a unit test, you're likely merely missing a " "base::test::ScopedTaskEnvironment member in your fixture.\n"; return TaskScheduler::GetInstance()->CreateSingleThreadTaskRunnerWithTraits( GetTaskTraitsWithExplicitPriority(traits), thread_mode); } #if defined(OS_WIN) scoped_refptr CreateCOMSTATaskRunnerWithTraits( const TaskTraits& traits, SingleThreadTaskRunnerThreadMode thread_mode) { DCHECK(TaskScheduler::GetInstance()) << "Ref. Prerequisite section of post_task.h.\n\n" "Hint: if this is in a unit test, you're likely merely missing a " "base::test::ScopedTaskEnvironment member in your fixture.\n"; return TaskScheduler::GetInstance()->CreateCOMSTATaskRunnerWithTraits( GetTaskTraitsWithExplicitPriority(traits), thread_mode); } #endif // defined(OS_WIN) } // namespace base