You.i Engine
YiTask.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_TASK_H_
3 #define _YI_TASK_H_
4 
5 #include "framework/YiPredef.h"
6 #include "thread/YiMutex.h"
7 #include "utility/YiBundle.h"
8 
9 #include "YiFuture.h"
10 
11 class CYIAbstractFuture;
12 class CYIMutex;
13 
25 {
26  friend class CYIAbstractFuture;
27  template<typename T> friend class CYITask;
28 
29 public:
33  typedef enum {
39  } TASK_STATE;
40 
41  virtual ~CYITaskBase();
42 
52  virtual bool TakeOwnershipOfFuture(std::unique_ptr<CYIAbstractFuture> pFuture);
53 
58  TASK_STATE GetState() const;
59 
64  bool IsFutureOwner() const;
65 
75  bool MarkPendingExecution();
76 
82  void RequestCancellation();
83 
95  bool Execute();
96 
97 protected:
98  virtual void RunAndAssignResult() = 0;
99 
106  bool IsCancellationRequested() const;
107 
114 
120  virtual void CleanUpAfterCancellation() {};
121 
122  mutable CYIMutex m_mutex;
123 
124 private:
125  // Hiding copy constructor and assignment operator
126  CYITaskBase(const CYITaskBase &);
127  CYITaskBase &operator=(const CYITaskBase &);
128  CYITaskBase(CYIAbstractFuture &rFuture);
129  CYITaskBase(std::unique_ptr<CYIAbstractFuture> pFuture);
130  CYITaskBase();
131 
132  void ExclusiveLock() const;
133  void ExclusiveUnlock() const;
134  void DisconnectFromFuture();
135  bool SetCancelledNonLocking();
136 
137  CYIAbstractFuture *m_pFuture;
138  std::unique_ptr<CYIAbstractFuture> m_pOwnedFuture;
139  TASK_STATE m_eState;
140  std::atomic<bool> m_bCancellationRequested;
141  bool m_bCancellationRequestSucceeded;
142 };
143 
144 
145 
167 template <typename ResultType = void>
168 class CYITask : public CYITaskBase
169 {
170 public:
171  CYITask();
172  CYITask(CYIFuture<ResultType> &rFuture);
173  CYITask(std::unique_ptr<CYIFuture<ResultType>> pFuture);
174  virtual ~CYITask();
175 
183  bool SetFuture(CYIFuture<ResultType> &rFuture);
184 
192  bool SetFuture(std::unique_ptr<CYIFuture<ResultType>> rFuture);
193 
194 private:
195  virtual void RunAndAssignResult() override;
196 
197 protected:
203  virtual ResultType Run() = 0;
204 };
205 
206 
212 template <>
213 class CYITask<> : public CYITaskBase
214 {
215 public:
216  CYITask();
217  CYITask(CYIFuture<> &rFuture);
218  CYITask(std::unique_ptr<CYIFuture<>> pFuture);
219  virtual ~CYITask();
220 
228  bool SetFuture(CYIFuture<> &rFuture);
229 
237  bool SetFuture(std::unique_ptr<CYIFuture<>> pFuture);
238 
239 private:
240  virtual void RunAndAssignResult() override;
241 
242 protected:
246  virtual void Run() = 0;
247 };
248 
249 
250 
256 template <typename ResultType>
257 class CYITask<ResultType*> : public CYITaskBase
258 {
259 public:
260  CYITask();
262  CYITask(std::unique_ptr<CYIFuture<ResultType *>> pFuture);
263  virtual ~CYITask();
264 
272  bool SetFuture(CYIFuture<ResultType*> &rFuture);
273 
281  bool SetFuture(std::unique_ptr<CYIFuture<ResultType *>> pFuture);
282 
283 private:
284  virtual void RunAndAssignResult() override;
285 
286 protected:
294  virtual ResultType* Run() = 0;
295 };
296 
297 
298 
299 // Use of array types in CYITask objects is not supported.
300 template <typename ResultType>
301 class CYITask<ResultType[]> : public CYITaskBase
302 {
303 private:
304  CYITask();
305 };
306 
307 
312 #include "YiTask.inl"
313 
314 #endif /* _YI_TASK_H_ */
Definition: YiTask.h:24
Definition: YiTask.h:37
Definition: YiMutex.h:110
Definition: YiTask.h:36
Definition: YiTask.h:34
virtual void CleanUpAfterCancellation()
Definition: YiTask.h:120
void RequestCancellation()
virtual ResultType Run()=0
bool IsFutureOwner() const
Definition: YiFuture.h:22
Definition: YiTask.h:38
CYIMutex m_mutex
Definition: YiTask.h:120
friend class CYITask
Definition: YiTask.h:27
TASK_STATE GetState() const
bool MarkPendingExecution()
Definition: YiTask.h:168
bool Execute()
bool SetFuture(CYIFuture< ResultType > &rFuture)
Definition: YiFuture.h:218
virtual void RunAndAssignResult()=0
Executes this task and assigns its result to the associated future object, if it exists.
TASK_STATE
Definition: YiTask.h:33
bool IsCancellationRequested() const
void SetCancellationRequestSucceeded()
Definition: YiFuture.h:139
virtual ~CYITaskBase()
virtual bool TakeOwnershipOfFuture(std::unique_ptr< CYIAbstractFuture > pFuture)
Definition: YiFuture.h:250
virtual ~CYITask()