1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_TASK_SCHEDULER_POST_TASK_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_TASK_SCHEDULER_POST_TASK_H_
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker #include <utility>
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/callback.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/location.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/post_task_and_reply_with_result_internal.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/sequenced_task_runner.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/single_thread_task_runner.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/task_runner.h"
19*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
20*635a8641SAndroid Build Coastguard Worker #include "base/task_scheduler/task_traits.h"
21*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
22*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
23*635a8641SAndroid Build Coastguard Worker
24*635a8641SAndroid Build Coastguard Worker namespace base {
25*635a8641SAndroid Build Coastguard Worker
26*635a8641SAndroid Build Coastguard Worker // This is the preferred interface to post tasks to the TaskScheduler.
27*635a8641SAndroid Build Coastguard Worker //
28*635a8641SAndroid Build Coastguard Worker // To post a simple one-off task with default traits:
29*635a8641SAndroid Build Coastguard Worker // PostTask(FROM_HERE, Bind(...));
30*635a8641SAndroid Build Coastguard Worker //
31*635a8641SAndroid Build Coastguard Worker // To post a high priority one-off task to respond to a user interaction:
32*635a8641SAndroid Build Coastguard Worker // PostTaskWithTraits(
33*635a8641SAndroid Build Coastguard Worker // FROM_HERE,
34*635a8641SAndroid Build Coastguard Worker // {TaskPriority::USER_BLOCKING},
35*635a8641SAndroid Build Coastguard Worker // Bind(...));
36*635a8641SAndroid Build Coastguard Worker //
37*635a8641SAndroid Build Coastguard Worker // To post tasks that must run in sequence with default traits:
38*635a8641SAndroid Build Coastguard Worker // scoped_refptr<SequencedTaskRunner> task_runner =
39*635a8641SAndroid Build Coastguard Worker // CreateSequencedTaskRunnerWithTraits(TaskTraits());
40*635a8641SAndroid Build Coastguard Worker // task_runner.PostTask(FROM_HERE, Bind(...));
41*635a8641SAndroid Build Coastguard Worker // task_runner.PostTask(FROM_HERE, Bind(...));
42*635a8641SAndroid Build Coastguard Worker //
43*635a8641SAndroid Build Coastguard Worker // To post tasks that may block, must run in sequence and can be skipped on
44*635a8641SAndroid Build Coastguard Worker // shutdown:
45*635a8641SAndroid Build Coastguard Worker // scoped_refptr<SequencedTaskRunner> task_runner =
46*635a8641SAndroid Build Coastguard Worker // CreateSequencedTaskRunnerWithTraits(
47*635a8641SAndroid Build Coastguard Worker // {MayBlock(), TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
48*635a8641SAndroid Build Coastguard Worker // task_runner.PostTask(FROM_HERE, Bind(...));
49*635a8641SAndroid Build Coastguard Worker // task_runner.PostTask(FROM_HERE, Bind(...));
50*635a8641SAndroid Build Coastguard Worker //
51*635a8641SAndroid Build Coastguard Worker // The default traits apply to tasks that:
52*635a8641SAndroid Build Coastguard Worker // (1) don't block (ref. MayBlock() and WithBaseSyncPrimitives()),
53*635a8641SAndroid Build Coastguard Worker // (2) prefer inheriting the current priority to specifying their own, and
54*635a8641SAndroid Build Coastguard Worker // (3) can either block shutdown or be skipped on shutdown
55*635a8641SAndroid Build Coastguard Worker // (TaskScheduler implementation is free to choose a fitting default).
56*635a8641SAndroid Build Coastguard Worker // Explicit traits must be specified for tasks for which these loose
57*635a8641SAndroid Build Coastguard Worker // requirements are not sufficient.
58*635a8641SAndroid Build Coastguard Worker //
59*635a8641SAndroid Build Coastguard Worker // Tasks posted through functions below will run on threads owned by the
60*635a8641SAndroid Build Coastguard Worker // registered TaskScheduler (i.e. not on the main thread). Tasks posted through
61*635a8641SAndroid Build Coastguard Worker // functions below with a delay may be coalesced (i.e. delays may be adjusted to
62*635a8641SAndroid Build Coastguard Worker // reduce the number of wakeups and hence power consumption).
63*635a8641SAndroid Build Coastguard Worker //
64*635a8641SAndroid Build Coastguard Worker // Prerequisite: A TaskScheduler must have been registered for the current
65*635a8641SAndroid Build Coastguard Worker // process via TaskScheduler::SetInstance() before the functions below are
66*635a8641SAndroid Build Coastguard Worker // valid. This is typically done during the initialization phase in each
67*635a8641SAndroid Build Coastguard Worker // process. If your code is not running in that phase, you most likely don't
68*635a8641SAndroid Build Coastguard Worker // have to worry about this. You will encounter DCHECKs or nullptr dereferences
69*635a8641SAndroid Build Coastguard Worker // if this is violated. For tests, prefer base::test::ScopedTaskEnvironment.
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker // Posts |task| to the TaskScheduler. Calling this is equivalent to calling
72*635a8641SAndroid Build Coastguard Worker // PostTaskWithTraits with plain TaskTraits.
73*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostTask(const Location& from_here, OnceClosure task);
74*635a8641SAndroid Build Coastguard Worker
75*635a8641SAndroid Build Coastguard Worker // Posts |task| to the TaskScheduler. |task| will not run before |delay|
76*635a8641SAndroid Build Coastguard Worker // expires. Calling this is equivalent to calling PostDelayedTaskWithTraits with
77*635a8641SAndroid Build Coastguard Worker // plain TaskTraits.
78*635a8641SAndroid Build Coastguard Worker //
79*635a8641SAndroid Build Coastguard Worker // Use PostDelayedTaskWithTraits to specify a BACKGROUND priority if the task
80*635a8641SAndroid Build Coastguard Worker // doesn't have to run as soon as |delay| expires.
81*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostDelayedTask(const Location& from_here,
82*635a8641SAndroid Build Coastguard Worker OnceClosure task,
83*635a8641SAndroid Build Coastguard Worker TimeDelta delay);
84*635a8641SAndroid Build Coastguard Worker
85*635a8641SAndroid Build Coastguard Worker // Posts |task| to the TaskScheduler and posts |reply| on the caller's execution
86*635a8641SAndroid Build Coastguard Worker // context (i.e. same sequence or thread and same TaskTraits if applicable) when
87*635a8641SAndroid Build Coastguard Worker // |task| completes. Calling this is equivalent to calling
88*635a8641SAndroid Build Coastguard Worker // PostTaskWithTraitsAndReply with plain TaskTraits. Can only be called when
89*635a8641SAndroid Build Coastguard Worker // SequencedTaskRunnerHandle::IsSet().
90*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostTaskAndReply(const Location& from_here,
91*635a8641SAndroid Build Coastguard Worker OnceClosure task,
92*635a8641SAndroid Build Coastguard Worker OnceClosure reply);
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Worker // Posts |task| to the TaskScheduler and posts |reply| with the return value of
95*635a8641SAndroid Build Coastguard Worker // |task| as argument on the caller's execution context (i.e. same sequence or
96*635a8641SAndroid Build Coastguard Worker // thread and same TaskTraits if applicable) when |task| completes. Calling this
97*635a8641SAndroid Build Coastguard Worker // is equivalent to calling PostTaskWithTraitsAndReplyWithResult with plain
98*635a8641SAndroid Build Coastguard Worker // TaskTraits. Can only be called when SequencedTaskRunnerHandle::IsSet().
99*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskAndReplyWithResult(const Location & from_here,OnceCallback<TaskReturnType ()> task,OnceCallback<void (ReplyArgType)> reply)100*635a8641SAndroid Build Coastguard Worker void PostTaskAndReplyWithResult(const Location& from_here,
101*635a8641SAndroid Build Coastguard Worker OnceCallback<TaskReturnType()> task,
102*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)> reply) {
103*635a8641SAndroid Build Coastguard Worker PostTaskWithTraitsAndReplyWithResult(from_here, TaskTraits(), std::move(task),
104*635a8641SAndroid Build Coastguard Worker std::move(reply));
105*635a8641SAndroid Build Coastguard Worker }
106*635a8641SAndroid Build Coastguard Worker
107*635a8641SAndroid Build Coastguard Worker // Callback version of PostTaskAndReplyWithResult above.
108*635a8641SAndroid Build Coastguard Worker // Though RepeatingCallback is convertible to OnceCallback, we need this since
109*635a8641SAndroid Build Coastguard Worker // we can not use template deduction and object conversion at once on the
110*635a8641SAndroid Build Coastguard Worker // overload resolution.
111*635a8641SAndroid Build Coastguard Worker // TODO(tzik): Update all callers of the Callback version to use OnceCallback.
112*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskAndReplyWithResult(const Location & from_here,Callback<TaskReturnType ()> task,Callback<void (ReplyArgType)> reply)113*635a8641SAndroid Build Coastguard Worker void PostTaskAndReplyWithResult(const Location& from_here,
114*635a8641SAndroid Build Coastguard Worker Callback<TaskReturnType()> task,
115*635a8641SAndroid Build Coastguard Worker Callback<void(ReplyArgType)> reply) {
116*635a8641SAndroid Build Coastguard Worker PostTaskAndReplyWithResult(
117*635a8641SAndroid Build Coastguard Worker from_here, OnceCallback<TaskReturnType()>(std::move(task)),
118*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)>(std::move(reply)));
119*635a8641SAndroid Build Coastguard Worker }
120*635a8641SAndroid Build Coastguard Worker
121*635a8641SAndroid Build Coastguard Worker // Posts |task| with specific |traits| to the TaskScheduler.
122*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostTaskWithTraits(const Location& from_here,
123*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
124*635a8641SAndroid Build Coastguard Worker OnceClosure task);
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker // Posts |task| with specific |traits| to the TaskScheduler. |task| will not run
127*635a8641SAndroid Build Coastguard Worker // before |delay| expires.
128*635a8641SAndroid Build Coastguard Worker //
129*635a8641SAndroid Build Coastguard Worker // Specify a BACKGROUND priority via |traits| if the task doesn't have to run as
130*635a8641SAndroid Build Coastguard Worker // soon as |delay| expires.
131*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostDelayedTaskWithTraits(const Location& from_here,
132*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
133*635a8641SAndroid Build Coastguard Worker OnceClosure task,
134*635a8641SAndroid Build Coastguard Worker TimeDelta delay);
135*635a8641SAndroid Build Coastguard Worker
136*635a8641SAndroid Build Coastguard Worker // Posts |task| with specific |traits| to the TaskScheduler and posts |reply| on
137*635a8641SAndroid Build Coastguard Worker // the caller's execution context (i.e. same sequence or thread and same
138*635a8641SAndroid Build Coastguard Worker // TaskTraits if applicable) when |task| completes. Can only be called when
139*635a8641SAndroid Build Coastguard Worker // SequencedTaskRunnerHandle::IsSet().
140*635a8641SAndroid Build Coastguard Worker BASE_EXPORT void PostTaskWithTraitsAndReply(const Location& from_here,
141*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
142*635a8641SAndroid Build Coastguard Worker OnceClosure task,
143*635a8641SAndroid Build Coastguard Worker OnceClosure reply);
144*635a8641SAndroid Build Coastguard Worker
145*635a8641SAndroid Build Coastguard Worker // Posts |task| with specific |traits| to the TaskScheduler and posts |reply|
146*635a8641SAndroid Build Coastguard Worker // with the return value of |task| as argument on the caller's execution context
147*635a8641SAndroid Build Coastguard Worker // (i.e. same sequence or thread and same TaskTraits if applicable) when |task|
148*635a8641SAndroid Build Coastguard Worker // completes. Can only be called when SequencedTaskRunnerHandle::IsSet().
149*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskWithTraitsAndReplyWithResult(const Location & from_here,const TaskTraits & traits,OnceCallback<TaskReturnType ()> task,OnceCallback<void (ReplyArgType)> reply)150*635a8641SAndroid Build Coastguard Worker void PostTaskWithTraitsAndReplyWithResult(
151*635a8641SAndroid Build Coastguard Worker const Location& from_here,
152*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
153*635a8641SAndroid Build Coastguard Worker OnceCallback<TaskReturnType()> task,
154*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)> reply) {
155*635a8641SAndroid Build Coastguard Worker TaskReturnType* result = new TaskReturnType();
156*635a8641SAndroid Build Coastguard Worker return PostTaskWithTraitsAndReply(
157*635a8641SAndroid Build Coastguard Worker from_here, traits,
158*635a8641SAndroid Build Coastguard Worker BindOnce(&internal::ReturnAsParamAdapter<TaskReturnType>, std::move(task),
159*635a8641SAndroid Build Coastguard Worker result),
160*635a8641SAndroid Build Coastguard Worker BindOnce(&internal::ReplyAdapter<TaskReturnType, ReplyArgType>,
161*635a8641SAndroid Build Coastguard Worker std::move(reply), Owned(result)));
162*635a8641SAndroid Build Coastguard Worker }
163*635a8641SAndroid Build Coastguard Worker
164*635a8641SAndroid Build Coastguard Worker // Callback version of PostTaskWithTraitsAndReplyWithResult above.
165*635a8641SAndroid Build Coastguard Worker // Though RepeatingCallback is convertible to OnceCallback, we need this since
166*635a8641SAndroid Build Coastguard Worker // we can not use template deduction and object conversion at once on the
167*635a8641SAndroid Build Coastguard Worker // overload resolution.
168*635a8641SAndroid Build Coastguard Worker // TODO(tzik): Update all callers of the Callback version to use OnceCallback.
169*635a8641SAndroid Build Coastguard Worker template <typename TaskReturnType, typename ReplyArgType>
PostTaskWithTraitsAndReplyWithResult(const Location & from_here,const TaskTraits & traits,Callback<TaskReturnType ()> task,Callback<void (ReplyArgType)> reply)170*635a8641SAndroid Build Coastguard Worker void PostTaskWithTraitsAndReplyWithResult(const Location& from_here,
171*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
172*635a8641SAndroid Build Coastguard Worker Callback<TaskReturnType()> task,
173*635a8641SAndroid Build Coastguard Worker Callback<void(ReplyArgType)> reply) {
174*635a8641SAndroid Build Coastguard Worker PostTaskWithTraitsAndReplyWithResult(
175*635a8641SAndroid Build Coastguard Worker from_here, traits, OnceCallback<TaskReturnType()>(std::move(task)),
176*635a8641SAndroid Build Coastguard Worker OnceCallback<void(ReplyArgType)>(std::move(reply)));
177*635a8641SAndroid Build Coastguard Worker }
178*635a8641SAndroid Build Coastguard Worker
179*635a8641SAndroid Build Coastguard Worker // Returns a TaskRunner whose PostTask invocations result in scheduling tasks
180*635a8641SAndroid Build Coastguard Worker // using |traits|. Tasks may run in any order and in parallel.
181*635a8641SAndroid Build Coastguard Worker BASE_EXPORT scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
182*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits);
183*635a8641SAndroid Build Coastguard Worker
184*635a8641SAndroid Build Coastguard Worker // Returns a SequencedTaskRunner whose PostTask invocations result in scheduling
185*635a8641SAndroid Build Coastguard Worker // tasks using |traits|. Tasks run one at a time in posting order.
186*635a8641SAndroid Build Coastguard Worker BASE_EXPORT scoped_refptr<SequencedTaskRunner>
187*635a8641SAndroid Build Coastguard Worker CreateSequencedTaskRunnerWithTraits(const TaskTraits& traits);
188*635a8641SAndroid Build Coastguard Worker
189*635a8641SAndroid Build Coastguard Worker // Returns a SingleThreadTaskRunner whose PostTask invocations result in
190*635a8641SAndroid Build Coastguard Worker // scheduling tasks using |traits| on a thread determined by |thread_mode|. See
191*635a8641SAndroid Build Coastguard Worker // base/task_scheduler/single_thread_task_runner_thread_mode.h for |thread_mode|
192*635a8641SAndroid Build Coastguard Worker // details. Tasks run on a single thread in posting order.
193*635a8641SAndroid Build Coastguard Worker //
194*635a8641SAndroid Build Coastguard Worker // If all you need is to make sure that tasks don't run concurrently (e.g.
195*635a8641SAndroid Build Coastguard Worker // because they access a data structure which is not thread-safe), use
196*635a8641SAndroid Build Coastguard Worker // CreateSequencedTaskRunnerWithTraits(). Only use this if you rely on a thread-
197*635a8641SAndroid Build Coastguard Worker // affine API (it might be safer to assume thread-affinity when dealing with
198*635a8641SAndroid Build Coastguard Worker // under-documented third-party APIs, e.g. other OS') or share data across tasks
199*635a8641SAndroid Build Coastguard Worker // using thread-local storage.
200*635a8641SAndroid Build Coastguard Worker BASE_EXPORT scoped_refptr<SingleThreadTaskRunner>
201*635a8641SAndroid Build Coastguard Worker CreateSingleThreadTaskRunnerWithTraits(
202*635a8641SAndroid Build Coastguard Worker const TaskTraits& traits,
203*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode thread_mode =
204*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode::SHARED);
205*635a8641SAndroid Build Coastguard Worker
206*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
207*635a8641SAndroid Build Coastguard Worker // Returns a SingleThreadTaskRunner whose PostTask invocations result in
208*635a8641SAndroid Build Coastguard Worker // scheduling tasks using |traits| in a COM Single-Threaded Apartment on a
209*635a8641SAndroid Build Coastguard Worker // thread determined by |thread_mode|. See
210*635a8641SAndroid Build Coastguard Worker // base/task_scheduler/single_thread_task_runner_thread_mode.h for |thread_mode|
211*635a8641SAndroid Build Coastguard Worker // details. Tasks run in the same Single-Threaded Apartment in posting order for
212*635a8641SAndroid Build Coastguard Worker // the returned SingleThreadTaskRunner. There is not necessarily a one-to-one
213*635a8641SAndroid Build Coastguard Worker // correspondence between SingleThreadTaskRunners and Single-Threaded
214*635a8641SAndroid Build Coastguard Worker // Apartments. The implementation is free to share apartments or create new
215*635a8641SAndroid Build Coastguard Worker // apartments as necessary. In either case, care should be taken to make sure
216*635a8641SAndroid Build Coastguard Worker // COM pointers are not smuggled across apartments.
217*635a8641SAndroid Build Coastguard Worker BASE_EXPORT scoped_refptr<SingleThreadTaskRunner>
218*635a8641SAndroid Build Coastguard Worker CreateCOMSTATaskRunnerWithTraits(const TaskTraits& traits,
219*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode thread_mode =
220*635a8641SAndroid Build Coastguard Worker SingleThreadTaskRunnerThreadMode::SHARED);
221*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_WIN)
222*635a8641SAndroid Build Coastguard Worker
223*635a8641SAndroid Build Coastguard Worker } // namespace base
224*635a8641SAndroid Build Coastguard Worker
225*635a8641SAndroid Build Coastguard Worker #endif // BASE_TASK_SCHEDULER_POST_TASK_H_
226