Home | History | Annotate | Download | only in task_scheduler
      1 // Copyright 2016 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/task_scheduler/post_task.h"
      6 
      7 #include <utility>
      8 
      9 #include "base/logging.h"
     10 #include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
     11 #include "base/task_scheduler/task_scheduler.h"
     12 #include "base/threading/post_task_and_reply_impl.h"
     13 
     14 namespace base {
     15 
     16 namespace {
     17 
     18 class PostTaskAndReplyWithTraitsTaskRunner
     19     : public internal::PostTaskAndReplyImpl {
     20  public:
     21   explicit PostTaskAndReplyWithTraitsTaskRunner(const TaskTraits& traits)
     22       : traits_(traits) {}
     23 
     24  private:
     25   bool PostTask(const Location& from_here, OnceClosure task) override {
     26     PostTaskWithTraits(from_here, traits_, std::move(task));
     27     return true;
     28   }
     29 
     30   const TaskTraits traits_;
     31 };
     32 
     33 // Returns TaskTraits based on |traits|. If TaskPriority hasn't been set
     34 // explicitly in |traits|, the returned TaskTraits have the current
     35 // TaskPriority.
     36 TaskTraits GetTaskTraitsWithExplicitPriority(const TaskTraits& traits) {
     37   if (traits.priority_set_explicitly())
     38     return traits;
     39   return TaskTraits::Override(traits,
     40                               {internal::GetTaskPriorityForCurrentThread()});
     41 }
     42 
     43 }  // namespace
     44 
     45 void PostTask(const Location& from_here, OnceClosure task) {
     46   PostDelayedTask(from_here, std::move(task), TimeDelta());
     47 }
     48 
     49 void PostDelayedTask(const Location& from_here,
     50                      OnceClosure task,
     51                      TimeDelta delay) {
     52   PostDelayedTaskWithTraits(from_here, TaskTraits(), std::move(task), delay);
     53 }
     54 
     55 void PostTaskAndReply(const Location& from_here,
     56                       OnceClosure task,
     57                       OnceClosure reply) {
     58   PostTaskWithTraitsAndReply(from_here, TaskTraits(), std::move(task),
     59                              std::move(reply));
     60 }
     61 
     62 void PostTaskWithTraits(const Location& from_here,
     63                         const TaskTraits& traits,
     64                         OnceClosure task) {
     65   PostDelayedTaskWithTraits(from_here, traits, std::move(task), TimeDelta());
     66 }
     67 
     68 void PostDelayedTaskWithTraits(const Location& from_here,
     69                                const TaskTraits& traits,
     70                                OnceClosure task,
     71                                TimeDelta delay) {
     72   DCHECK(TaskScheduler::GetInstance())
     73       << "Ref. Prerequisite section of post_task.h.\n\n"
     74          "Hint: if this is in a unit test, you're likely merely missing a "
     75          "base::test::ScopedTaskEnvironment member in your fixture.\n";
     76   TaskScheduler::GetInstance()->PostDelayedTaskWithTraits(
     77       from_here, GetTaskTraitsWithExplicitPriority(traits), std::move(task),
     78       std::move(delay));
     79 }
     80 
     81 void PostTaskWithTraitsAndReply(const Location& from_here,
     82                                 const TaskTraits& traits,
     83                                 OnceClosure task,
     84                                 OnceClosure reply) {
     85   PostTaskAndReplyWithTraitsTaskRunner(traits).PostTaskAndReply(
     86       from_here, std::move(task), std::move(reply));
     87 }
     88 
     89 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(const TaskTraits& traits) {
     90   DCHECK(TaskScheduler::GetInstance())
     91       << "Ref. Prerequisite section of post_task.h.\n\n"
     92          "Hint: if this is in a unit test, you're likely merely missing a "
     93          "base::test::ScopedTaskEnvironment member in your fixture.\n";
     94   return TaskScheduler::GetInstance()->CreateTaskRunnerWithTraits(
     95       GetTaskTraitsWithExplicitPriority(traits));
     96 }
     97 
     98 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits(
     99     const TaskTraits& traits) {
    100   DCHECK(TaskScheduler::GetInstance())
    101       << "Ref. Prerequisite section of post_task.h.\n\n"
    102          "Hint: if this is in a unit test, you're likely merely missing a "
    103          "base::test::ScopedTaskEnvironment member in your fixture.\n";
    104   return TaskScheduler::GetInstance()->CreateSequencedTaskRunnerWithTraits(
    105       GetTaskTraitsWithExplicitPriority(traits));
    106 }
    107 
    108 scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits(
    109     const TaskTraits& traits,
    110     SingleThreadTaskRunnerThreadMode thread_mode) {
    111   DCHECK(TaskScheduler::GetInstance())
    112       << "Ref. Prerequisite section of post_task.h.\n\n"
    113          "Hint: if this is in a unit test, you're likely merely missing a "
    114          "base::test::ScopedTaskEnvironment member in your fixture.\n";
    115   return TaskScheduler::GetInstance()->CreateSingleThreadTaskRunnerWithTraits(
    116       GetTaskTraitsWithExplicitPriority(traits), thread_mode);
    117 }
    118 
    119 #if defined(OS_WIN)
    120 scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits(
    121     const TaskTraits& traits,
    122     SingleThreadTaskRunnerThreadMode thread_mode) {
    123   DCHECK(TaskScheduler::GetInstance())
    124       << "Ref. Prerequisite section of post_task.h.\n\n"
    125          "Hint: if this is in a unit test, you're likely merely missing a "
    126          "base::test::ScopedTaskEnvironment member in your fixture.\n";
    127   return TaskScheduler::GetInstance()->CreateCOMSTATaskRunnerWithTraits(
    128       GetTaskTraitsWithExplicitPriority(traits), thread_mode);
    129 }
    130 #endif  // defined(OS_WIN)
    131 
    132 }  // namespace base
    133