SelfCheckerFSM.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. #include "stdafx.h"
  2. #define WIN32_LEAN_AND_MEAN
  3. #include <algorithm>
  4. #include "SelfCheckerFSM.h"
  5. #include "EventCode.h"
  6. #pragma comment(lib,"user32.lib")
  7. class CSelfCheckerEntity;
  8. const int MAX_AYSNC_TIMEOUT = 60000;
  9. const int MAX_CHECK_TIME = 60000;
  10. const int MAX_CPU_CHECK_TIME = 5000;
  11. const int TIMER_ID_CHECK = 0;
  12. const int TIMER_CPU_CHECK = 1;
  13. const int THOUSAND = 1024;
  14. const int MILLION = 1048576;
  15. int ActionStrToInt(const char* pAction)
  16. {
  17. int ret = 0;
  18. char x = *pAction;
  19. if (x >= '0' && x <= '9')
  20. return x - '0';
  21. else
  22. return 0;
  23. }
  24. DWORD GetRadixProduct(int times, int radix)
  25. {
  26. DWORD dwRet = 1;
  27. if (times < 0 || (radix != 10 && radix != 16))
  28. return 0;
  29. else
  30. {
  31. for (int i = 0; i < times; i++)
  32. dwRet *= radix;
  33. }
  34. return dwRet;
  35. }
  36. DWORD CodeStrToInt(const char* pCode)
  37. {
  38. CSimpleStringA csCode(pCode);
  39. csCode = csCode.Trim();
  40. int len = csCode.GetLength();
  41. if (len < 0 || len > 10)
  42. {
  43. return 0;
  44. }
  45. DWORD dwRet = 0;
  46. if (len > 2 && csCode[0] == '0' && (csCode[1] == 'x' || csCode[1] == 'X'))//"0x1234,0X12FF"
  47. {
  48. for (int i = 2; i < len; i++)
  49. {
  50. if (csCode[i] <= '9' && csCode[i] >= '0')
  51. dwRet += (csCode[i] - '0') * GetRadixProduct(len - i - 1, 16);
  52. else if (csCode[i] <= 'f' && csCode[i] >= 'a')
  53. dwRet += (csCode[i] - 'a' + 10) * GetRadixProduct(len - i - 1, 16);
  54. else if (csCode[i] <= 'F' && csCode[i] >= 'A')
  55. dwRet += (csCode[i] - 'A' + 10) * GetRadixProduct(len - i - 1, 16);
  56. else
  57. return 0;//because there is a invalid char,break process and return 0
  58. }
  59. }
  60. else//"768"
  61. {
  62. for (int i = 0; i < len; i++)
  63. {
  64. if (csCode[i] <= '9' && csCode[i] >= '0')
  65. dwRet += (csCode[i] - '0') * GetRadixProduct(len - i - 1, 10);
  66. else
  67. return 0;//because there is a invalid char,break process and return 0
  68. }
  69. }
  70. return dwRet;
  71. }
  72. ErrorCodeEnum CSelfCheckerFSM::OnInit()
  73. {
  74. m_xIdlePre = m_xKernelPre = m_xUserPre = 0;
  75. ErrorCodeEnum errCode = Initial();
  76. if (errCode != Error_Succeed)
  77. return Error_IO;
  78. return Error_Succeed;
  79. }
  80. ErrorCodeEnum CSelfCheckerFSM::OnExit()
  81. {
  82. return Error_Succeed;
  83. }
  84. void CSelfCheckerFSM::s0_on_entry()
  85. {
  86. LOG_FUNCTION();
  87. ErrorCodeEnum errCode;
  88. CAutoArray<WORD> tmpInstIDs;
  89. CAutoArray<CSimpleStringA> tmpNames;
  90. errCode = GetEntityBase()->GetFunction()->GetAllRegistedEntity(tmpNames, tmpInstIDs);
  91. if (errCode != Error_Succeed)
  92. {
  93. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get started entity failed.[%d]",errCode);
  94. }
  95. for (int i = 0; i < tmpNames.GetCount(); ++i)
  96. {
  97. ErrorCodeEnum eErr;
  98. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  99. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  100. CEntityRunInfo runInfo;
  101. eErr = pFunc->GetEntityRunInfo(tmpNames[i], runInfo);
  102. if (runInfo.eState != EntityState_NoStart
  103. || tmpNames[i] == "Download" || tmpNames[i] == "UpgradeRun" || tmpNames[i] == "UpgradeManager")
  104. {
  105. m_allEntity.push_back(tmpNames[i]);
  106. }
  107. }
  108. FSMEvent* pEvt = new FSMEvent(USER_EVT_INIT);
  109. PostEventFIFO(pEvt);
  110. }
  111. void CSelfCheckerFSM::s0_on_exit()
  112. {
  113. }
  114. unsigned int CSelfCheckerFSM::s0_on_event(FSMEvent* pEvt)
  115. {
  116. LOG_FUNCTION();
  117. switch (pEvt->iEvt)
  118. {
  119. case USER_EVT_INIT:
  120. pEvt->SetHandled();
  121. break;
  122. default:
  123. break;
  124. }
  125. return 0;
  126. }
  127. void CSelfCheckerFSM::s1_on_entry()
  128. {
  129. LOG_FUNCTION();
  130. void* pTmpData = NULL;
  131. ITimerListener* pListener = new TimerOutHelper<CSelfCheckerFSM>(this, &CSelfCheckerFSM::OnNormalWorkTimerout, pTmpData);
  132. GetEntityBase()->GetFunction()->SetTimer(TIMER_ID_CHECK, pListener, MAX_CHECK_TIME);
  133. }
  134. void CSelfCheckerFSM::s1_on_exit()
  135. {
  136. LOG_FUNCTION();
  137. }
  138. unsigned int CSelfCheckerFSM::s1_on_event(FSMEvent* evt)
  139. {
  140. LOG_FUNCTION();
  141. return 0;
  142. }
  143. void CSelfCheckerFSM::s2_on_entry()
  144. {
  145. LOG_FUNCTION();
  146. }
  147. void CSelfCheckerFSM::s2_on_exit()
  148. {
  149. LOG_FUNCTION();
  150. }
  151. unsigned int CSelfCheckerFSM::s2_on_event(FSMEvent* evt)
  152. {
  153. LOG_FUNCTION();
  154. return 0;
  155. }
  156. void CSelfCheckerFSM::s3_on_entry()
  157. {
  158. LOG_FUNCTION();
  159. }
  160. void CSelfCheckerFSM::s3_on_exit()
  161. {
  162. LOG_FUNCTION();
  163. }
  164. unsigned int CSelfCheckerFSM::s3_on_event(FSMEvent* evt)
  165. {
  166. LOG_FUNCTION();
  167. return 0;
  168. }
  169. int ch2int(char ch)
  170. {
  171. if (ch >= '0' && ch <= '9')
  172. return ch - '0';
  173. else if (ch >= 'a' && ch <= 'f')
  174. return ch - 'a' + 10;
  175. else if (ch >= 'A' && ch <= 'F')
  176. return ch - 'A' + 10;
  177. return 0;
  178. }
  179. long hexstr2int(const char* str, int len)
  180. {
  181. long result = 0;
  182. for (int i = 0; i < len; ++i)
  183. {
  184. result += (ch2int(str[i]) << ((len - i - 1) * 4));
  185. }
  186. return result;
  187. }
  188. bool StrEqualNoCase(const char* s1, const char* s2, int len)
  189. {
  190. if (strlen(s1) != strlen(s2))
  191. return false;
  192. for (int i = 0; i < len; ++i)
  193. {
  194. if (toupper(s1[i]) != toupper(s2[i]))
  195. return false;
  196. }
  197. return true;
  198. }
  199. ErrorCodeEnum CSelfCheckerFSM::Initial()
  200. {
  201. ErrorCodeEnum err;
  202. CSmartPointer<IConfigInfo> spCenConfig;
  203. err = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCenConfig);
  204. if (err != Error_Succeed) {
  205. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed!");
  206. return Error_IO;
  207. }
  208. m_restartNormal = 2;
  209. m_restartSpecial = 5;
  210. m_maxOsRestart = 5;
  211. m_maxPowerRestart = 5;
  212. do {
  213. int value(0);
  214. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "RestartNormal", value);
  215. if (value != 0) m_restartNormal = value;
  216. } while (false);
  217. do {
  218. int value(0);
  219. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "RestartSpecial", value);
  220. if (value != 0) m_restartSpecial = value;
  221. } while (false);
  222. do {
  223. int value(0);
  224. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxOsRestart", value);
  225. if (value != 0) m_maxOsRestart = value;
  226. } while (false);
  227. do {
  228. int value(0);
  229. spCenConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxPowerRestart", value);
  230. if (value != 0) m_maxPowerRestart = value;
  231. } while (false);
  232. err = GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  233. if (err != Error_Succeed)
  234. {
  235. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get System Static info failed(%d).",err);
  236. return Error_Unexpect;
  237. }
  238. m_activeEntity.push_back("Chromium");
  239. return Error_Succeed;
  240. }
  241. ErrorCodeEnum CSelfCheckerFSM::CheckEntity(const char* pszEntityName, EntityTestEnum eTestType, bool bNormalCheck)
  242. {
  243. if (bNormalCheck)
  244. {
  245. //oilyang@20230426 ,常规自检时,针对"TerminalStage"做对应处理(自检分常规自检和即时自检)
  246. //"S":准入服务告知准入不过,不再进行实体自检
  247. //非"A":其他启动失败导致进关门页,不再对硬件以及其他没必要自检的实体进行自检
  248. CSimpleStringA tmpTerminalStage("");
  249. GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", tmpTerminalStage);
  250. if (tmpTerminalStage.Compare("S") == 0)
  251. return Error_Succeed;
  252. else if (tmpTerminalStage.Compare("A") != 0)
  253. {
  254. //the hardward entity and some other entity no need to test
  255. if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0 || _strnicmp("CardIssuer", pszEntityName, strlen("CardIssuer")) == 0
  256. || _strnicmp("ContactlessCard", pszEntityName, strlen("ContactlessCard")) == 0
  257. || _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
  258. || _strnicmp("gpio", pszEntityName, strlen("gpio")) == 0 || _strnicmp("HSPScanner", pszEntityName, strlen("HSPScanner")) == 0
  259. || _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
  260. )
  261. return Error_Succeed;
  262. }
  263. }
  264. //oilyang@20170926 no need to check by self.Let the HealthManager entity to do it.
  265. //oilyang@20231106 no need to check VtmLoader
  266. if (pszEntityName != NULL && (strnicmp(pszEntityName, GetEntityBase()->GetEntityName(), strlen(GetEntityBase()->GetEntityName())) == 0
  267. || strnicmp(pszEntityName, "VtmLoader", strlen("VtmLoader")) == 0))
  268. return Error_Succeed;
  269. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  270. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  271. CSmartPointer<IAsynWaitSp> spWait;
  272. ErrorCodeEnum errCode;
  273. errCode = pFuncPrivilege->TestEntity(pszEntityName, eTestType, spWait);
  274. if (errCode == Error_Succeed)
  275. {
  276. callback_entry* entry = new callback_entry();
  277. entry->pRawData = NULL;
  278. entry->EntityName = pszEntityName;
  279. entry->ErrorResult = Error_Unexpect;
  280. entry->op = Test_ShakeHand;
  281. spWait->SetCallback(this, entry);
  282. }
  283. else
  284. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Test %s,%d", pszEntityName, errCode);
  285. return errCode;
  286. }
  287. void CSelfCheckerFSM::OnNormalWorkTimerout(void* pData)
  288. {
  289. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  290. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  291. CSmartPointer<IAsynWaitSp> spWait;
  292. ErrorCodeEnum errCode;
  293. int activeEnCount = m_activeEntity.size();
  294. vector<CSimpleStringA>::iterator it;
  295. for (it = m_activeEntity.begin(); it != m_activeEntity.end(); ++it)
  296. {
  297. errCode = CheckEntity(*it, Test_ShakeHand);
  298. CEntityRunInfo runInfo;
  299. pFunc->GetEntityRunInfo(*it, runInfo);
  300. //CheckEntityResouce(*it, runInfo);
  301. }
  302. GetEntityBase()->GetFunction()->ResetTimer(TIMER_ID_CHECK, MAX_CHECK_TIME);
  303. }
  304. void CSelfCheckerFSM::DoOnCreated(const char* pszEntityName, ErrorCodeEnum eOnStartErrorCode, const char* pszCallerEntity)
  305. {
  306. }
  307. void CSelfCheckerFSM::DoOnClosed(const char* pszEntityName, EntityCloseCauseEnum eCloseCause, ErrorCodeEnum eOnCloseErrorCode, const char* pszCallerEntity)
  308. {
  309. }
  310. void CSelfCheckerFSM::DoOnException(const char* pszEntityName, const char* pszFunctionName, EntityStateEnum eState, EntityStateEnum eLastState, ErrorCodeEnum eErrorCode)
  311. {
  312. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("OnException:%s,%s,%d,%d,%d", pszEntityName, pszFunctionName, eState, eLastState, eErrorCode);
  313. }
  314. void CSelfCheckerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  315. {
  316. CSmartPointer<ICallbackListener> spCallback;
  317. CSmartPointer<IReleasable> pData;
  318. pAsynWaitSp->GetCallback(spCallback, pData);
  319. //LOG_ASSERT(pData);
  320. callback_entry* entry = dynamic_cast<callback_entry*>((IReleasable*)pData.GetRawPointer());
  321. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  322. callback_entry* new_entry = new callback_entry();
  323. new_entry->EntityName = entry->EntityName;
  324. new_entry->ErrorResult = entry->ErrorResult;
  325. new_entry->op = entry->op;
  326. new_entry->state = entry->state;
  327. m_entRunInfo[new_entry->EntityName].eTest = new_entry->ErrorResult; //add test result oilyang 20150616
  328. if (new_entry->op == Test_ShakeHand && new_entry->ErrorResult != Error_Succeed) {
  329. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oiltmp shakehand %s turns out %s, entity state: %s", (LPCTSTR)new_entry->EntityName, SpStrError(new_entry->ErrorResult), SpStrEntityState((EntityStateEnum)new_entry->state));
  330. }
  331. if (new_entry->ErrorResult != Error_Succeed)
  332. {
  333. ErrorCodeEnum eErr;
  334. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  335. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  336. if (_strnicmp("MediaController", (const char*)new_entry->EntityName, strlen("MediaController")) == 0
  337. && !m_bEverInMainPage)
  338. {
  339. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("On loading stage,don't process MediaController exception.");
  340. }
  341. else
  342. Proc((const char*)new_entry->EntityName, ProcType_Shake, new_entry->ErrorResult);
  343. }
  344. else
  345. {
  346. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  347. CSmartPointer<IConfigInfo> spConfig;
  348. ErrorCodeEnum eErr = spEntityFunction->OpenConfig(Config_Run, spConfig);
  349. if (eErr != Error_Succeed) {
  350. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open run cfg file failed!");
  351. return;
  352. }
  353. spConfig->WriteConfigValueInt(new_entry->EntityName, "OsRestart", 0);
  354. spConfig->WriteConfigValueInt(new_entry->EntityName, "PowerRestart", 0);
  355. }
  356. }
  357. int CSelfCheckerFSM::AddEntityState(const char* pszEntityName, EntityStateEnum eState)
  358. {
  359. if (eState == EntityState_Starting)
  360. {
  361. m_entRunInfo[pszEntityName].bGetLoadOpt = false;
  362. m_entRunInfo[pszEntityName].bRestarting = false;
  363. m_entRunInfo[pszEntityName].loadOpt = 99;
  364. m_entRunInfo[pszEntityName].eState = eState;
  365. m_entRunInfo[pszEntityName].eTest = Error_Succeed;
  366. }
  367. else
  368. m_entRunInfo[pszEntityName].eState = eState;
  369. if (eState == EntityState_Idle)
  370. {
  371. m_entRunInfo[pszEntityName].eTest = Error_Succeed;
  372. m_entRunInfo[pszEntityName].memoryHighCount = 0;
  373. }
  374. m_entRunInfo[pszEntityName].cpuRatio = 0;
  375. return 0;
  376. }
  377. int CSelfCheckerFSM::Proc(string entity, ProcType eType, DWORD dwCode, const char* pszMessage)
  378. {
  379. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("using default process...entity:%s,eType:%d,dwCode:%x,msg:%s", entity.c_str(), eType, dwCode, pszMessage);
  380. if (eType == ProcType_Shake && (dwCode == Error_TimeOut || dwCode == Error_Unexpect || dwCode == Error_InvalidState))
  381. ExceptionErrorProcess(eType, entity.c_str(), ACTION_ENTITY_RESTART, true);
  382. else if (eType == ProcType_Warn)
  383. ExceptionErrorProcess(eType, entity.c_str(), dwCode, true, pszMessage);
  384. else
  385. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("What's this:type:%d,receive code:%x,msg:%s, from entity %s.", eType, dwCode, pszMessage, entity.c_str());
  386. return -1;
  387. }
  388. ErrorCodeEnum CSelfCheckerFSM::ExceptionErrorProcess(ProcType eType, const char* pszEntityName, DWORD dwAction, bool bDefault, const char* pszMessage)
  389. {
  390. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  391. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  392. CSmartPointer<IAsynWaitSp> spWait;
  393. ErrorCodeEnum eErrCode = Error_Unexpect;
  394. switch (dwAction)
  395. {
  396. case ACTION_EXAMINE:
  397. break;
  398. case ACTION_RESET:
  399. break;
  400. case ACTION_CLOSE:
  401. eErrCode = pFuncPrivilege->CloseEntity(pszEntityName, spWait);
  402. if (eErrCode == Error_Succeed)
  403. {
  404. }
  405. break;
  406. case ACTION_ENTITY_RESTART:
  407. {
  408. if (m_entCfgInfo[pszEntityName].bWaitRestart)
  409. {
  410. if (!bDefault)
  411. {
  412. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("waiting restart...");
  413. break;
  414. }
  415. }
  416. //if (m_entRunInfo[pszEntityName].loadOpt == 99)
  417. //{
  418. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("not configure? name:[%s]", pszEntityName);
  419. // break;
  420. //}
  421. //oilyang@20200407 if being restarted by selfchecker,break
  422. if (m_entRunInfo[pszEntityName].bRestarting)
  423. {
  424. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("%s is being restarted by selfchecker.", pszEntityName);
  425. break;
  426. }
  427. //oilyang@20240313 comment all of the following, to see the behaving in the future
  428. //oilyang@20200403
  429. //for fwb test,PinPad&CardSwiper can't be stop immediately
  430. //huchen@20210220,SIPPhone can't be stop immediately
  431. //if (_strnicmp("PinPad", pszEntityName, strlen("PinPad")) == 0
  432. // || _strnicmp("CardSwiper", pszEntityName, strlen("CardSwiper")) == 0
  433. // //oilyang@20210220 for huchen add SIPPhone
  434. // || _strnicmp("SIPPhone", pszEntityName, strlen("SIPPhone")) == 0
  435. // || _strnicmp("IDCertificate", pszEntityName, strlen("IDCertificate")) == 0
  436. // || _strnicmp("FingerPrint", pszEntityName, strlen("FingerPrint")) == 0
  437. // || _strnicmp("DeviceControl", pszEntityName, strlen("DeviceControl")) == 0)
  438. // eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  439. //else
  440. eErrCode = pFuncPrivilege->StopEntity(pszEntityName, spWait);
  441. if (eErrCode == Error_Succeed)
  442. {
  443. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  444. if (eErrCode != Error_Succeed)
  445. {
  446. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait stop %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  447. eErrCode = pFuncPrivilege->TerminateEntity(pszEntityName, spWait);
  448. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  449. if (eErrCode != Error_Succeed)
  450. {
  451. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait terminate %s failed: %s.", pszEntityName, SpStrError(eErrCode));
  452. break;
  453. }
  454. }
  455. }
  456. else
  457. {
  458. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Stop %s failed(%d).", pszEntityName, eErrCode);
  459. break;
  460. }
  461. Sleep(2000);
  462. eErrCode = pFuncPrivilege->StartEntity(pszEntityName, NULL, spWait);
  463. if (eErrCode == Error_Succeed)
  464. {
  465. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  466. if (eErrCode != Error_Succeed)
  467. {
  468. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("spwait start %s failed(%d).", pszEntityName, eErrCode);
  469. break;
  470. }
  471. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Start entity %s suc.", pszEntityName);
  472. }
  473. else
  474. {
  475. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("(re)Start %s failed(%d).", pszEntityName, eErrCode);
  476. break;
  477. }
  478. }
  479. break;
  480. default:
  481. break;
  482. }
  483. return eErrCode;
  484. }
  485. void CSelfCheckerFSM::SetEverEnterMainPageFlag(bool bValue)
  486. {
  487. m_bEverInMainPage = bValue;
  488. }
  489. void CSelfCheckerFSM::GetEntityList(CSimpleStringA csList)
  490. {
  491. CAutoArray<CSimpleStringA> arrStageList;
  492. arrStageList.Init(64);
  493. arrStageList = csList.Split('|');
  494. for (int i = 0; i < arrStageList.GetCount(); ++i)
  495. {
  496. CAutoArray<CSimpleStringA> arrEntity;
  497. arrEntity.Init(2);
  498. arrEntity = arrStageList[i].Split('=');
  499. if (arrEntity.GetCount() < 2)
  500. break;
  501. //去重,防止前面已经加载了
  502. if (find(m_activeEntity.begin(), m_activeEntity.end(), arrEntity[0].GetData()) != m_activeEntity.end())
  503. continue;
  504. m_activeEntity.push_back(arrEntity[0]);
  505. m_entRunInfo[arrEntity[0]].bGetLoadOpt = true;
  506. if (arrEntity[1].Compare("1") == 0)
  507. {
  508. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s config with loadopt 1", arrEntity[0].GetData());
  509. m_entRunInfo[arrEntity[0]].loadOpt = 1;
  510. }
  511. else if (arrEntity[1].Compare("2") == 0)
  512. {
  513. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%s config with loadopt 2", arrEntity[0].GetData());
  514. m_entRunInfo[arrEntity[0]].loadOpt = 2;
  515. }
  516. else
  517. m_entRunInfo[arrEntity[0]].loadOpt = 0;
  518. }
  519. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_activeEntity has %d entity", m_activeEntity.size());
  520. }