int finalized(const pmix_proc_t *proc, void *server_object, pmix_op_cbfunc_t cbfunc, void *cbdata) { if( CLI_TERM <= cli_info[proc->rank].state ){ TEST_ERROR(("double termination of rank %d", proc->rank)); return PMIX_SUCCESS; } TEST_VERBOSE(("Rank %d terminated", proc->rank)); cli_finalize(&cli_info[proc->rank]); finalized_count++; if (finalized_count == cli_info_cnt) { if (NULL != pmix_test_published_list) { PMIX_LIST_RELEASE(pmix_test_published_list); } } if (NULL != cbfunc) { cbfunc(PMIX_SUCCESS, cbdata); } return PMIX_SUCCESS; }
void cli_cleanup(cli_info_t *cli) { if (0 > cli->state || CLI_TERM < cli->state) { TEST_ERROR(("Bad rank %d state %d", cli_rank(cli), cli->state)); test_abort = true; return; } switch( cli->next_state[cli->state] ){ case CLI_FORKED: break; case CLI_CONNECTED: /* error - means that process terminated w/o calling finalize */ if (!test_abort) { TEST_ERROR(("rank %d with state %d unexpectedly terminated.", cli_rank(cli), cli->state)); } cli->state = CLI_TERM; test_abort = true; break; case CLI_FIN: /* error - means that process terminated w/o calling finalize */ if (!test_abort) { TEST_ERROR(("rank %d with state %d unexpectedly terminated.", cli_rank(cli), cli->state)); } cli_finalize(cli); cli_cleanup(cli); test_abort = true; break; case CLI_DISCONN: cli_disconnect(cli); cli_cleanup(cli); break; case CLI_TERM: cli_terminate(cli); break; default: TEST_ERROR(("Bad rank %d next state %d", cli_rank(cli), cli->next_state[cli->state])); test_abort = true; return; } }