QuantumLibrary
quantum_task.h
1 /*
2 ** Copyright 2018 Bloomberg Finance L.P.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 #ifndef BLOOMBERG_QUANTUM_TASK_H
17 #define BLOOMBERG_QUANTUM_TASK_H
18 
19 #include <iostream>
20 #include <memory>
21 #include <list>
22 #include <utility>
23 #include <quantum/interface/quantum_iterminate.h>
24 #include <quantum/interface/quantum_icontext.h>
25 #include <quantum/interface/quantum_iqueue.h>
26 #include <quantum/interface/quantum_itask_continuation.h>
27 #include <quantum/interface/quantum_itask_accessor.h>
28 #include <quantum/quantum_traits.h>
29 #include <quantum/util/quantum_util.h>
30 
31 namespace Bloomberg {
32 namespace quantum {
33 
34 //==============================================================================================
35 // class Task
36 //==============================================================================================
40 class Task : public ITaskContinuation,
41  public std::enable_shared_from_this<Task>
42 {
43 public:
44  using Ptr = std::shared_ptr<Task>;
45  using WeakPtr = std::weak_ptr<Task>;
46 
47  template <class RET, class FUNC, class ... ARGS>
48  Task(std::shared_ptr<Context<RET>> ctx,
49  ITask::Type type,
50  FUNC&& func,
51  ARGS&&... args);
52 
53  template <class RET, class FUNC, class ... ARGS>
54  Task(std::shared_ptr<Context<RET>> ctx,
55  int queueId,
56  bool isHighPriority,
57  ITask::Type type,
58  FUNC&& func,
59  ARGS&&... args);
60 
61  Task(const Task& task) = delete;
62  Task(Task&& task) = default;
63  Task& operator=(const Task& task) = delete;
64  Task& operator=(Task&& task) = default;
65 
66  ~Task();
67 
68  //ITerminate
69  void terminate() final;
70 
71  //ITask
72  int run() final;
73  void setQueueId(int queueId) final;
74  int getQueueId() final;
75  Type getType() const final;
76  bool isBlocked() const final;
77  bool isSleeping(bool updateTimer = false) final;
78  bool isHighPriority() const final;
79 
80  //ITaskContinuation
82  void setNextTask(ITaskContinuation::Ptr nextTask) final;
84  void setPrevTask(ITaskContinuation::Ptr prevTask) final;
86 
87  //Returns a final or error handler task in the chain and in the process frees all
88  //the subsequent continuation tasks
90 
91  //===================================
92  // NEW / DELETE
93  //===================================
94  static void* operator new(size_t size);
95  static void operator delete(void* p);
96  static void deleter(Task* p);
97 
98 private:
99  ITaskAccessor::Ptr _ctx; //holds execution context
100  Traits::Coroutine _coro; //the current runnable coroutine
101  int _queueId;
102  bool _isHighPriority;
103  int _rc; //return from the co-routine
104  ITaskContinuation::Ptr _next; //Task scheduled to run after current completes.
105  ITaskContinuation::WeakPtr _prev; //Previous task in the chain
106  ITask::Type _type;
107  std::atomic_flag _terminated;
108 };
109 
110 using TaskPtr = Task::Ptr;
112 
113 }}
114 
115 #include <quantum/impl/quantum_task_impl.h>
116 
117 #endif //BLOOMBERG_QUANTUM_TASK_H
ITaskContinuation::Ptr getNextTask() final
Definition: quantum_task_impl.h:114
Definition: quantum_buffer_impl.h:22
int getQueueId() final
Definition: quantum_task_impl.h:105
void setNextTask(ITaskContinuation::Ptr nextTask) final
Definition: quantum_task_impl.h:117
void terminate() final
Terminates the object.
Definition: quantum_task_impl.h:79
ITaskContinuation::Ptr getFirstTask() final
Definition: quantum_task_impl.h:126
void setQueueId(int queueId) final
Definition: quantum_task_impl.h:99
Definition: quantum_stl_impl.h:23
Task & operator=(const Task &task)=delete
Type
Definition: quantum_itask.h:37
Runnable object representing a coroutine.
Definition: quantum_task.h:40
int run() final
Definition: quantum_task_impl.h:88
std::weak_ptr< Task > WeakPtr
Definition: quantum_task.h:45
ITaskContinuation::Ptr getErrorHandlerOrFinalTask() final
Definition: quantum_task_impl.h:132
std::shared_ptr< ITask > Ptr
Definition: quantum_itask.h:34
Concrete class representing a coroutine or a thread context.
Definition: quantum_icoro_context.h:29
bool isSleeping(bool updateTimer=false) final
Definition: quantum_task_impl.h:158
std::weak_ptr< ITask > WeakPtr
Definition: quantum_itask.h:35
bool isHighPriority() const final
Definition: quantum_task_impl.h:164
Interface to a task continuation. For internal use only.
Definition: quantum_itask_continuation.h:30
std::shared_ptr< Task > Ptr
Definition: quantum_task.h:44
Task(std::shared_ptr< Context< RET >> ctx, ITask::Type type, FUNC &&func, ARGS &&... args)
Definition: quantum_task_impl.h:41
Type getType() const final
Definition: quantum_task_impl.h:111
Interface to a task accessor. For internal use only.
Definition: quantum_itask_accessor.h:31
static void deleter(Task *p)
Definition: quantum_task_impl.h:182
Interface to a task. For internal use only.
Definition: quantum_itask.h:32
bool isBlocked() const final
Definition: quantum_task_impl.h:152
Task::Ptr TaskPtr
Definition: quantum_task.h:110
ITaskContinuation::Ptr getPrevTask() final
Definition: quantum_task_impl.h:120
Contains definitions for various traits used by this library. For internal use only.
Definition: quantum_traits.h:55
Task::WeakPtr TaskWeakPtr
Definition: quantum_task.h:111
void setPrevTask(ITaskContinuation::Ptr prevTask) final
Definition: quantum_task_impl.h:123