|
@@ -61,6 +61,8 @@
|
|
|
#define MOD_CMD_SWITCH_RUNNING_MODE 23
|
|
|
#define MOD_CMD_USER_STATE_EVENT 24
|
|
|
|
|
|
+#define MOD_CMD_ENT_RESULT_EX 25
|
|
|
+
|
|
|
#define MOD_CMD_NOTIFY_REDIRECT_SUBSCRIBE 31 // shell -> entity
|
|
|
#define MOD_CMD_REPORT_REDIRECT_SUBSCRIBE 32 // entity -> shell
|
|
|
|
|
@@ -385,6 +387,16 @@ int sp_mod_entity_stub_finish_test(sp_mod_entity_stub_t *stub, int result)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int sp_mod_entity_stub_finish_exam(sp_mod_entity_stub_t* stub, int result, int statistic)
|
|
|
+{
|
|
|
+ iobuffer_t* pkt = iobuffer_create(-1, -1);
|
|
|
+ iobuffer_write(pkt, IOBUF_T_I4, &statistic, 0);
|
|
|
+ sp_svc_post(stub->svc, SP_SHELL_MOD_ID, SP_SHELL_SVC_ID, SP_PKT_MOD | MOD_CMD_ENT_RESULT_EX, result, &pkt);
|
|
|
+ if (pkt)
|
|
|
+ iobuffer_dec_ref(pkt);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int sp_mod_entity_stub_finish_redirect_subscribe(sp_mod_entity_stub_t *stub, sp_uid_t *uid, int suggest_entity_id)
|
|
|
{
|
|
|
iobuffer_t *pkt = iobuffer_create(-1, -1);
|
|
@@ -1240,7 +1252,17 @@ static int mgr_on_pkt(sp_svc_t *svc,int epid, int svc_id, int pkt_type, int pkt_
|
|
|
ent->wait_result = result;
|
|
|
SetEvent(ent->evt_wait_handle);
|
|
|
}
|
|
|
- } else if (cmd_type == MOD_CMD_MOD_RESULT) {
|
|
|
+ } else if (cmd_type == MOD_CMD_ENT_RESULT_EX) {
|
|
|
+ sp_entity_t* ent = sp_mod_mgr_find_entity_by_idx(mgr, svc_id);
|
|
|
+ if (ent->mod->doing) {
|
|
|
+ unsigned int statistic = 0;
|
|
|
+ iobuffer_read(*p_pkt, IOBUF_T_I4, &statistic, NULL);
|
|
|
+ ent->wait_result = result;
|
|
|
+ ent->result_param1 = statistic;
|
|
|
+ SetEvent(ent->evt_wait_handle);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (cmd_type == MOD_CMD_MOD_RESULT) {
|
|
|
mod = sp_mod_mgr_find_module_by_idx(mgr, epid);
|
|
|
if (mod->doing) {
|
|
|
mod->wait_result = result;
|
|
@@ -1362,6 +1384,7 @@ int sp_mod_mgr_add_entity(sp_mod_mgr_t *mgr, sp_cfg_shell_entity_t *cfg_ent)
|
|
|
ent->state = EntityState_NoStart;
|
|
|
ent->mod = mod;
|
|
|
ent->wait_result = 0;
|
|
|
+ ent->result_param1 = ent->result_param2 = 0;
|
|
|
ent->first_start_time = 0;
|
|
|
ent->last_start_time = 0;
|
|
|
ent->state_start_time = 0;
|
|
@@ -2237,7 +2260,7 @@ static int continue_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_enti
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int trigger_entity_id)
|
|
|
+static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int trigger_entity_id, int* result)
|
|
|
{
|
|
|
int rc = 0;
|
|
|
sp_mod_t *mod;
|
|
@@ -2285,6 +2308,7 @@ static int test_entity(sp_mod_mgr_t *mgr, sp_entity_t *ent, int test_type, int t
|
|
|
} else if (dwRet == WAIT_OBJECT_0+1) {
|
|
|
sp_dbg_debug("wait for test entity %s result ok, result = %d!", ent->cfg->name, ent->wait_result);
|
|
|
rc = ent->wait_result;
|
|
|
+ if (result) *result = ent->result_param1;
|
|
|
} else {
|
|
|
sp_dbg_debug("wait for test entity %s timeout!", ent->cfg->name);
|
|
|
rc = Error_TimeOut;
|
|
@@ -2339,13 +2363,13 @@ int sp_mod_mgr_continue_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_ent
|
|
|
return sp_mod_mgr_continue_entity2(mgr, ent, trigger_entity_id);
|
|
|
}
|
|
|
|
|
|
-int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type)
|
|
|
+int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type, int* cause)
|
|
|
{
|
|
|
sp_entity_t *ent;
|
|
|
ent = sp_mod_mgr_find_entity_by_idx(mgr, entity_id);
|
|
|
if (!ent)
|
|
|
return Error_NotExist;
|
|
|
- return sp_mod_mgr_test_entity2(mgr, ent, trigger_entity_id, test_type);
|
|
|
+ return sp_mod_mgr_test_entity2(mgr, ent, trigger_entity_id, test_type, cause);
|
|
|
}
|
|
|
|
|
|
int sp_mod_mgr_lost_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id)
|
|
@@ -2505,7 +2529,7 @@ int sp_mod_mgr_continue_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_entity_id, int test_type)
|
|
|
+int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_entity_id, int test_type, int* result)
|
|
|
{
|
|
|
int rc;
|
|
|
|
|
@@ -2513,7 +2537,7 @@ int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *ent, int trigger_ent
|
|
|
return Error_NotExist;
|
|
|
|
|
|
if (try_lock_doing(mgr, ent->mod)) {
|
|
|
- rc = test_entity(mgr, ent, test_type, trigger_entity_id);
|
|
|
+ rc = test_entity(mgr, ent, test_type, trigger_entity_id, result);
|
|
|
unlock_doing(mgr, ent->mod);
|
|
|
} else {
|
|
|
sp_dbg_warn("mod %s is busy doing now! line: %d", ent->mod->cfg->name, __LINE__);
|