CFTTAsyncEvent.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // CFTTAsyncEvent - [2020-04-13 11:57:46]
  2. #ifndef _CFTTASYNCEVENT_H_
  3. #define _CFTTASYNCEVENT_H_
  4. #include "CFTTMemPool_Resizing.h"
  5. #include "FTTMutex.h"
  6. #include "FTTSemaphore.h"
  7. #include "FTTThread.h"
  8. /*
  9. 001FAA2C CFTTAsyncEvent<TFTTFileAsyncEventData>::CFTTAsyncEvent(EFTTEventType,bool,bool)
  10. 001FAAAC CFTTAsyncEvent<TFTTFileAsyncEventData>::AddCallback(void (*)(CFTTAsyncEvent<TFTTFileAsyncEventData>*,TFTTFileAsyncEventData const*,void *),void *)
  11. 001FAF54 CFTTAsyncEvent<TFTTFileAsyncEventData>::WaitForCompletion(TFTTFileAsyncEventData*)
  12. 001FAFE8 CFTTAsyncEvent<TFTTFileAsyncEventData>::~CFTTAsyncEvent()
  13. 00265478 CFTTAsyncEvent<TFTTFileAsyncEventData>::Complete(TFTTFileAsyncEventData const*)
  14. 00265CB4 CFTTAsyncEvent<CFTTJob *>::Complete(CFTTJob * const*)
  15. 00265DCC CFTTAsyncEvent<CFTTJob *>::~CFTTAsyncEvent()
  16. void (*)(CFTTAsyncEvent<TFTTFileAsyncEventData>*, TFTTFileAsyncEventData const*,void *)
  17. CFTTAsyncEvent<TFTTFileAsyncEventData> 0x70
  18. v33 = operator new(0x70, 0, 0, v31);
  19. CFTTAsyncEvent<TFTTFileAsyncEventData>::CFTTAsyncEvent((int)v33, 2, 1, 0);
  20. CFTTAsyncEvent<CFTTJob *> 0x44
  21. TFTTFileAsyncEventData 0x28
  22. */
  23. //-------------------------------------------------------------------------------------------------
  24. enum EFTTEventType {
  25. EFTTEventType_0,
  26. EFTTEventType_1,
  27. EFTTEventType_2,
  28. EFTTEventType_3,
  29. EFTTEventType_4
  30. };
  31. //-------------------------------------------------------------------------------------------------
  32. extern FTTMutex CFTTAsyncEvent_tCallbackMutex_5CE3E8; // 0x5CE3E8
  33. extern FTTMutex CFTTAsyncEvent_tWakeupMutex_5CE40C; // 0x5CE40C
  34. extern CFTTMemPool_Resizing* CFTTAsyncEvent_CallbackPool_5CE3E4; // 0x5CE3E4
  35. //-------------------------------------------------------------------------------------------------
  36. template <typename T>
  37. class CFTTAsyncEvent {
  38. public:
  39. typedef void (*asyncevent_callback)(CFTTAsyncEvent<T>* pAsyncEvent, T const* pTemplate, void* pClass);
  40. struct EventNode {
  41. asyncevent_callback fun_0;
  42. void* pClass;
  43. EventNode* next_8;
  44. };
  45. CFTTAsyncEvent(): FTTSemaphore_8(0, 8, nullptr), bool_0(false){
  46. }
  47. // 001FAA2C //^_-
  48. CFTTAsyncEvent(EFTTEventType dEventType, bool a2, bool a3) : FTTSemaphore_8(0, 8, nullptr), bool_0(false) {
  49. // 001FAA52
  50. LOGI("CFTTAsyncEvent::CFTTAsyncEvent entry");
  51. if (CFTTAsyncEvent_CallbackPool_5CE3E4 == nullptr) {
  52. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock(); // 001FAA5E
  53. if (CFTTAsyncEvent_CallbackPool_5CE3E4 == nullptr) { //原始的汇编就是在这里重复两次判断
  54. CFTTAsyncEvent_CallbackPool_5CE3E4 = new CFTTMemPool_Resizing;
  55. CFTTAsyncEvent_CallbackPool_5CE3E4->pResizing_Node_0 = nullptr;
  56. CFTTAsyncEvent_CallbackPool_5CE3E4->dsize_4 = sizeof(EventNode);
  57. CFTTAsyncEvent_CallbackPool_5CE3E4->count_8 = 0x40;
  58. CFTTAsyncEvent_CallbackPool_5CE3E4->uyMagnify_C = 0;
  59. CFTTAsyncEvent_CallbackPool_5CE3E4->eHeapId_10 = EFTTMemHeapID_0;
  60. }
  61. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  62. }
  63. // loc_1FAA8E
  64. EFTTEventType_4 = dEventType;
  65. pEventNode_38 = nullptr;
  66. bool_1 = a2;
  67. bool_2 = a3;
  68. count_68 = 0;
  69. };
  70. // 001FAFE8 //^_^
  71. ~CFTTAsyncEvent() {
  72. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock();
  73. EventNode* node = pEventNode_38;
  74. if (node) {
  75. while (node) {
  76. pEventNode_38 = node->next_8;
  77. CFTTAsyncEvent_CallbackPool_5CE3E4->Deallocate(node);
  78. node = pEventNode_38;
  79. }
  80. }
  81. if (!CFTTAsyncEvent_CallbackPool_5CE3E4->pResizing_Node_0) {
  82. if (CFTTAsyncEvent_CallbackPool_5CE3E4) {
  83. delete CFTTAsyncEvent_CallbackPool_5CE3E4;
  84. }
  85. CFTTAsyncEvent_CallbackPool_5CE3E4 = nullptr;
  86. }
  87. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  88. };
  89. // 00265478 //^_^
  90. void Complete(T const* pT) {
  91. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock();
  92. if (bool_0) {
  93. // loc_265492
  94. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  95. return;
  96. }
  97. // loc_26549C
  98. memcpy(&tmplate_40, pT, sizeof(T));
  99. EventNode* r6_pEventNode_38 = pEventNode_38;
  100. if (bool_1)
  101. pEventNode_38 = nullptr;
  102. // loc_2654B2
  103. if (r6_pEventNode_38 && bool_2) {
  104. for (EventNode* r5_pNode = r6_pEventNode_38; r5_pNode != nullptr; r5_pNode = r5_pNode->next_8) { // loc_2654C8
  105. // loc_2654BC
  106. r5_pNode->fun_0(this, pT, r5_pNode->pClass);
  107. }
  108. }
  109. // loc_2654CC
  110. if (EFTTEventType_4 != EFTTEventType_1) {
  111. // 002654D2
  112. bool_0 = true;
  113. if (EFTTEventType_4 == EFTTEventType_0) {
  114. // loc_265570
  115. if (r6_pEventNode_38 == nullptr || (bool_2 && !bool_1)) {
  116. // loc_26557E
  117. FTTSemaphore_8.SignalSema(8);
  118. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  119. return;
  120. }
  121. }
  122. }
  123. // loc_2654DA
  124. FTTSemaphore_8.SignalSema(8);
  125. if (EFTTEventType_4 == EFTTEventType_1) {
  126. // loc_2654F4
  127. while (count_68) {
  128. FTTThread_Sleep(1);
  129. }
  130. for (uint dr7 = 8; dr7 != 0; dr7--) { // loc_26550A
  131. // loc_2654FE
  132. FTTSemaphore_8.WaitSema(-1);
  133. }
  134. }
  135. // loc_26550E
  136. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  137. // 00265514
  138. if (r6_pEventNode_38 != nullptr) {
  139. if (!bool_2) {
  140. // 0026551A
  141. for (EventNode* r5_pNode = r6_pEventNode_38; r5_pNode != nullptr; r5_pNode = r5_pNode->next_8) { // loc_26552A
  142. // loc_26551E
  143. r5_pNode->fun_0(this, pT, r5_pNode->pClass);
  144. }
  145. }
  146. // loc_26552E
  147. if (bool_1) {
  148. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock();
  149. // loc_26554C
  150. for (; r6_pEventNode_38 != nullptr; r6_pEventNode_38 = r6_pEventNode_38->next_8) { // loc_26554C
  151. // loc_265540
  152. CFTTAsyncEvent_CallbackPool_5CE3E4->Deallocate(r6_pEventNode_38);
  153. }
  154. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  155. }
  156. }
  157. // LOGE("Complete%p EFTTEventType_4=%xEFTTEventType_2=%x", this,EFTTEventType_4,EFTTEventType_2);
  158. // loc_265556
  159. // if (this != nullptr) //??? 原始函数当中确实,有这一行,但是是感觉没有必要这么写,会引起编译警告,暂时先去掉了
  160. {
  161. if (EFTTEventType_4 == EFTTEventType_2) {
  162. delete this;
  163. }
  164. }
  165. return;
  166. };
  167. // 001FAAAC //^_^
  168. void AddCallback(asyncevent_callback pFunc_Callback, void* pclass) {
  169. LOGI("CFTTAsyncEvent::AddCallback Entry");
  170. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock();
  171. if (!bool_0 || !bool_1) {
  172. EventNode* v9 = (EventNode*)CFTTAsyncEvent_CallbackPool_5CE3E4->Allocate(); //引用计数 +1
  173. v9->fun_0 = pFunc_Callback;
  174. v9->pClass = pclass;
  175. v9->next_8 = pEventNode_38;
  176. pEventNode_38 = v9;
  177. if (!bool_0) {
  178. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  179. LOGI("CFTTAsyncEvent::AddCallback End 11");
  180. return;
  181. }
  182. }
  183. T tmplate;
  184. memcpy(&tmplate, &tmplate_40, sizeof(T));
  185. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  186. LOGI("CFTTAsyncEvent::AddCallback pFunc_Callback");
  187. pFunc_Callback(this, &tmplate, pclass);
  188. LOGI("CFTTAsyncEvent::AddCallback End");
  189. };
  190. // 001FAF54 //^_^
  191. void WaitForCompletion(T* pTemplate) {
  192. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Lock();
  193. if (bool_0) {
  194. if (pTemplate) {
  195. memcpy(pTemplate, &tmplate_40, sizeof(T));
  196. }
  197. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  198. } else {
  199. CFTTAsyncEvent_tWakeupMutex_5CE40C.Lock();
  200. ++count_68;
  201. CFTTAsyncEvent_tWakeupMutex_5CE40C.Unlock();
  202. CFTTAsyncEvent_tCallbackMutex_5CE3E8.Unlock();
  203. if (FTTSemaphore_8.WaitSema(-1)) {
  204. CFTTAsyncEvent_tWakeupMutex_5CE40C.Lock();
  205. --count_68;
  206. CFTTAsyncEvent_tWakeupMutex_5CE40C.Unlock();
  207. if (pTemplate)
  208. memcpy(pTemplate, &tmplate_40, sizeof(T));
  209. FTTSemaphore_8.SignalSema(1);
  210. }
  211. }
  212. };
  213. uint8 bool_0;
  214. bool bool_1;
  215. bool bool_2;
  216. bool unuse_3;
  217. EFTTEventType EFTTEventType_4;
  218. FTTSemaphore FTTSemaphore_8;
  219. EventNode* pEventNode_38; // call back function link list
  220. int field_3C;
  221. T tmplate_40;
  222. int count_68;
  223. };
  224. #endif //_CFTTASYNCEVENT_H_