LRT14  1.0
 All Classes Namespaces Functions Variables Enumerations Enumerator
do_async.h
1 #ifndef RHESUS_DO_ASYNC_H_
2 #define RHESUS_DO_ASYNC_H_
3 
4 #include "TaskPool.h"
5 
6 namespace Rhesus
7 {
8 namespace Toolkit
9 {
10 namespace Tasks
11 {
12 
13  template<typename AsyncMethodClassPtr, typename AsyncMethodFuncPtr,
14  typename AsyncCallbackClassPtr = AsyncMethodClassPtr,
15  typename AsyncCallbackFuncPtr = AsyncMethodFuncPtr>
16  class do_async {
17  private:
18  struct TaskStruct {
19  AsyncMethodClassPtr ptr;
20  AsyncMethodFuncPtr mptr;
21  AsyncCallbackFuncPtr cptr;
22  AsyncCallbackClassPtr ccptr;
23  UINT32 arg0;
24  UINT32 arg1;
25  UINT32 arg2;
26  UINT32 arg3;
27  UINT32 arg4;
28  UINT32 arg5;
29  UINT32 arg6;
30  UINT32 arg7;
31 
32  INT32 callMethod()
33  {
34  return (ptr->*mptr)(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
35  }
36 
37  INT32 callCallback(INT32 retCode)
38  {
39  return (ccptr->*cptr)(retCode);
40  }
41  };
42 
43  public:
44  static INT32 AsyncMethodWrapper(TaskStruct* t) {
45  // printf("!!in wrapper!!\n");
46 
47  // do_async* instance = reinterpret_cast<do_async*>(p0);
48  //
49  // if(instance->m_asyncFunc == NULL) return -1;
50 
51  // printf("calling func: %u\n", p0);
52 
53  //call function
54  INT32 retCode = t->callMethod();
55 
56  //callback
57  if (t->ccptr != NULL &&t->cptr != NULL)
58  t->callCallback(retCode);
59 
60  DELETE(t);
61 
62  return 0;
63  }
64 
65  do_async(AsyncMethodClassPtr inst, AsyncMethodFuncPtr asyncFunc,
66  UINT32 p0 = 0, UINT32 p1 = 0, UINT32 p2 = 0, UINT32 p3 = 0,
67  UINT32 p4 = 0, UINT32 p5 = 0, UINT32 p6 = 0, UINT32 p7 = 0)
68  {
69  // printf("!!starting wrapper!!\n");
70  TaskStruct* t = create(inst, asyncFunc, NULL, NULL, p0, p1, p2,p3, p4, p5, p6, p7);
71  TaskPool::EnqueueTask((FUNCPTR) AsyncMethodWrapper, (UINT32)t);
72  // m_asyncTask->Start((UINT32)this, p0, p1, p2, p3, p4, p5, p6, p7);
73  }
74 
75  do_async(AsyncMethodClassPtr inst, AsyncMethodFuncPtr asyncFunc,
76  AsyncMethodClassPtr c_inst, AsyncCallbackFuncPtr callback,
77  UINT32 p0 = 0, UINT32 p1 = 0, UINT32 p2 = 0, UINT32 p3 = 0,
78  UINT32 p4 = 0, UINT32 p5 = 0, UINT32 p6 = 0, UINT32 p7 = 0)
79  {
80  // printf("!!starting wrapper!!\n");
81  TaskStruct* t = create(inst, asyncFunc, callback, c_inst, p0, p1, p2,p3, p4, p5, p6, p7);
82  TaskPool::EnqueueTask((FUNCPTR) AsyncMethodWrapper, (UINT32)t);
83  // m_asyncTask->Start((UINT32)this, p0, p1, p2, p3, p4, p5, p6, p7);
84  }
85 
86  private:
87 
88  TaskStruct* create(AsyncMethodClassPtr ptr, AsyncMethodFuncPtr mptr,
89  AsyncCallbackFuncPtr cptr, AsyncCallbackClassPtr ccptr, UINT32 arg0, UINT32 arg1, UINT32 arg2,
90  UINT32 arg3, UINT32 arg4, UINT32 arg5, UINT32 arg6, UINT32 arg7)
91  {
92  TaskStruct* t = new TaskStruct();
93  t->ptr = ptr;
94  t->mptr = mptr;
95  t->cptr = cptr;
96  t->ccptr = ccptr;
97  t->arg0 = arg0;
98  t->arg1 = arg1;
99  t->arg2 = arg2;
100  t->arg3 = arg3;
101  t->arg4 = arg4;
102  t->arg5 = arg5;
103  t->arg6 = arg6;
104  t->arg7 = arg7;
105  return t;
106  }
107 
108  // INT32 do_func(UINT32 p0, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4, UINT32 p5,
109  // UINT32 p6, UINT32 p7)
110  // {
111  // (m_asyncInst->*m_asyncFunc)(p0, p1, p2, p3, p4, p5, p6, p7);
112  //
113  // return 0;
114  // }
115  //
116  // void do_callback(INT32 retCode)
117  // {
118  // if(m_callbackInst == NULL || m_asyncCallback == NULL)
119  // return;
120  //
121  // (m_callbackInst->*m_asyncCallback)(retCode);
122  // }
123  //
124  // RhesusTask& m_asyncTask;
125  //
126  // AsyncMethodClassPtr m_asyncInst;
127  // AsyncMethodFuncPtr m_asyncFunc;
128  // AsyncMethodClassPtr m_callbackInst;
129  // AsyncCallbackFuncPtr m_asyncCallback;
130  };
131 }
132 }
133 }
134 
135 #endif