LRT14  1.0
 All Classes Namespaces Functions Variables Enumerations Enumerator
do_async.hpp
1 #ifndef RHESUS_DO_ASYNC_H_
2 #define RHESUS_DO_ASYNC_H_
3 
4 #include "RhesusTask.h"
5 
6 #include "TaskPool.h"
7 
8 namespace Rhesus
9 {
10 namespace Toolkit
11 {
12 namespace Tasks
13 {
14  template<typename AsyncMethodClassPtr, typename AsyncMethodFuncPtr, typename AsyncCallbackClassPtr = AsyncMethodClassPtr, typename AsyncCallbackFuncPtr = AsyncMethodFuncPtr>
15  class do_async
16  {
17  public:
18  static INT32 AsyncMethodWrapper(UINT32 p0, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4, UINT32 p5,
19  UINT32 p6, UINT32 p7, UINT32 p8)
20  {
21  printf("!!in wrapper!!\n");
22 
23  do_async* instance = reinterpret_cast<do_async*>(p0);
24 
25  if(instance->m_asyncFunc == NULL) return -1;
26 
27  printf("calling func: %u\n", p0);
28 
29  INT32 ret = instance->do_func(p1, p2, p3, p4, p5, p6, p7, p8);
30 
31  instance->do_callback(ret);
32 
33  return 0;
34  }
35  do_async(AsyncMethodClassPtr inst, AsyncMethodFuncPtr asyncFunc, UINT32 p0 = 0, UINT32 p1 = 0, UINT32 p2 = 0, UINT32 p3 = 0, UINT32 p4 = 0, UINT32 p5 = 0,
36  UINT32 p6 = 0, UINT32 p7 = 0)
37  : m_asyncTask(RhesusTask::CreateNew("Async Function", (FUNCPTR)AsyncMethodWrapper)),
38  m_asyncInst(inst),
39  m_asyncFunc(asyncFunc),
40  m_callbackInst(NULL),
41  m_asyncCallback(NULL)
42  {
43  printf("!!starting wrapper!!\n");
44  m_asyncTask.Start((UINT32)this, p0, p1, p2, p3, p4, p5, p6, p7);
45  }
46 
47  do_async(AsyncMethodClassPtr inst, AsyncMethodFuncPtr asyncFunc, AsyncMethodClassPtr c_inst, AsyncCallbackFuncPtr callback, UINT32 p0 = 0, UINT32 p1 = 0, UINT32 p2 = 0, UINT32 p3 = 0, UINT32 p4 = 0, UINT32 p5 = 0,
48  UINT32 p6 = 0, UINT32 p7 = 0)
49  : m_asyncTask(RhesusTask::CreateNew("Async Function", (FUNCPTR)AsyncMethodWrapper)),
50  m_asyncInst(inst),
51  m_asyncFunc(asyncFunc),
52  m_callbackInst(c_inst),
53  m_asyncCallback(callback)
54  {
55  printf("!!starting wrapper!!\n");
56  TaskPool::EnqueueTask((FUNCPTR)AsyncMethodWrapper, (UINT32)this, p0, p1, p2, p3, p4, p5, p6, p7);
57 // m_asyncTask.Start((UINT32)this, p0, p1, p2, p3, p4, p5, p6, p7);
58  }
59 
60  private:
61 
62  INT32 do_func(UINT32 p0, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4, UINT32 p5,
63  UINT32 p6, UINT32 p7)
64  {
65  (m_asyncInst->*m_asyncFunc)(p0, p1, p2, p3, p4, p5, p6, p7);
66 
67  return 0;
68  }
69 
70  void do_callback(INT32 retCode)
71  {
72  if(m_callbackInst == NULL || m_asyncCallback == NULL)
73  return;
74 
75  (m_callbackInst->*m_asyncCallback)(retCode);
76  }
77 
78  RhesusTask& m_asyncTask;
79 
80  AsyncMethodClassPtr m_asyncInst;
81  AsyncMethodFuncPtr m_asyncFunc;
82  AsyncMethodClassPtr m_callbackInst;
83  AsyncCallbackFuncPtr m_asyncCallback;
84  };
85 }
86 }
87 }
88 
89 #endif