• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Marl Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef marl_task_h
16 #define marl_task_h
17 
18 #include "export.h"
19 
20 #include <functional>
21 
22 namespace marl {
23 
24 // Task is a unit of work for the scheduler.
25 class Task {
26  public:
27   using Function = std::function<void()>;
28 
29   enum class Flags {
30     None = 0,
31 
32     // SameThread ensures the task will be run on the same thread that scheduled
33     // the task. This can offer performance improvements if the current thread
34     // is immediately going to block on the newly scheduled task, by reducing
35     // overheads of waking another thread.
36     SameThread = 1,
37   };
38 
39   MARL_NO_EXPORT inline Task();
40   MARL_NO_EXPORT inline Task(const Task&);
41   MARL_NO_EXPORT inline Task(Task&&);
42   MARL_NO_EXPORT inline Task(const Function& function,
43                              Flags flags = Flags::None);
44   MARL_NO_EXPORT inline Task(Function&& function, Flags flags = Flags::None);
45   MARL_NO_EXPORT inline Task& operator=(const Task&);
46   MARL_NO_EXPORT inline Task& operator=(Task&&);
47   MARL_NO_EXPORT inline Task& operator=(const Function&);
48   MARL_NO_EXPORT inline Task& operator=(Function&&);
49 
50   // operator bool() returns true if the Task has a valid function.
51   MARL_NO_EXPORT inline operator bool() const;
52 
53   // operator()() runs the task.
54   MARL_NO_EXPORT inline void operator()() const;
55 
56   // is() returns true if the Task was created with the given flag.
57   MARL_NO_EXPORT inline bool is(Flags flag) const;
58 
59  private:
60   Function function;
61   Flags flags = Flags::None;
62 };
63 
Task()64 Task::Task() {}
Task(const Task & o)65 Task::Task(const Task& o) : function(o.function), flags(o.flags) {}
Task(Task && o)66 Task::Task(Task&& o) : function(std::move(o.function)), flags(o.flags) {}
Task(const Function & function,Flags flags)67 Task::Task(const Function& function, Flags flags /* = Flags::None */)
68     : function(function), flags(flags) {}
Task(Function && function,Flags flags)69 Task::Task(Function&& function, Flags flags /* = Flags::None */)
70     : function(std::move(function)), flags(flags) {}
71 Task& Task::operator=(const Task& o) {
72   function = o.function;
73   flags = o.flags;
74   return *this;
75 }
76 Task& Task::operator=(Task&& o) {
77   function = std::move(o.function);
78   flags = o.flags;
79   return *this;
80 }
81 
82 Task& Task::operator=(const Function& f) {
83   function = f;
84   flags = Flags::None;
85   return *this;
86 }
87 Task& Task::operator=(Function&& f) {
88   function = std::move(f);
89   flags = Flags::None;
90   return *this;
91 }
92 Task::operator bool() const {
93   return function.operator bool();
94 }
95 
operator()96 void Task::operator()() const {
97   function();
98 }
99 
is(Flags flag)100 bool Task::is(Flags flag) const {
101   return (static_cast<int>(flags) & static_cast<int>(flag)) ==
102          static_cast<int>(flag);
103 }
104 
105 }  // namespace marl
106 
107 #endif  // marl_task_h
108