int opal_progress_thread_finalize(const char *name) { assert(NULL == name); agent_thread_time_to_exit = true; /* break the event loop - this will cause the loop to exit upon completion of any current event */ opal_event_base_loopbreak(agent_evbase); opal_thread_join(&agent_thread, NULL); return OPAL_SUCCESS; }
static void tool_finalize(void) { if (signals_set) { /* Release all local signal handlers */ opal_event_del(&epipe_handler); opal_event_del(&term_handler); opal_event_del(&int_handler); opal_event_signal_del(&sigusr1_handler); opal_event_signal_del(&sigusr2_handler); } (void) mca_base_framework_close(&orte_errmgr_base_framework); (void) mca_base_framework_close(&orte_routed_base_framework); orte_wait_finalize(); if (progress_thread_running) { /* we had to leave the progress thread running until * we closed the routed framework as that closure * sends a "sync" message to the local daemon. it * is now safe to stop the progress thread */ orte_event_base_active = false; /* break the event loop */ opal_event_base_loopbreak(orte_event_base); /* wait for thread to exit */ opal_thread_join(&progress_thread, NULL); OBJ_DESTRUCT(&progress_thread); progress_thread_running = false; } (void) mca_base_framework_close(&orte_rml_base_framework); (void) mca_base_framework_close(&orte_oob_base_framework); (void) mca_base_framework_close(&orte_state_base_framework); (void) mca_base_framework_close(&orcm_db_base_framework); (void) mca_base_framework_close(&opal_dstore_base_framework); }
void orte_quit(int fd, short args, void *cbdata) { orte_state_caddy_t *caddy = (orte_state_caddy_t*)cbdata; /* cleanup */ if (NULL != caddy) { OBJ_RELEASE(caddy); } /* check one-time lock to protect against "bounce" */ if (opal_atomic_trylock(&orte_quit_lock)) { /* returns 1 if already locked */ return; } /* if we are the hnp and haven't already reported it, then * report any errors */ if (ORTE_PROC_IS_HNP && !errors_reported) { if (0 != orte_exit_status && !orte_execute_quiet) { errors_reported = true; /* abnormal termination of some kind */ dump_aborted_procs(); /* If we showed more abort messages than were allowed, show a followup message here */ if (num_failed_start > 1) { if (orte_xml_output) { fprintf(orte_xml_fp, "<stderr>"); } fprintf(orte_xml_fp, "%d total process%s failed to start", num_failed_start, ((num_failed_start > 1) ? "es" : "")); if (orte_xml_output) { fprintf(orte_xml_fp, "
</stderr>"); } fprintf(orte_xml_fp, "\n"); } if (num_aborted > 1) { if (orte_xml_output) { fprintf(orte_xml_fp, "<stderr>"); } fprintf(orte_xml_fp, "%d total process%s aborted", num_aborted, ((num_aborted > 1) ? "es" : "")); if (orte_xml_output) { fprintf(orte_xml_fp, "
</stderr>"); } fprintf(orte_xml_fp, "\n"); } if (num_killed > 1) { if (orte_xml_output) { fprintf(orte_xml_fp, "<stderr>"); } fprintf(orte_xml_fp, "%d total process%s killed (some possibly by %s during cleanup)", num_killed, ((num_killed > 1) ? "es" : ""), orte_basename); if (orte_xml_output) { fprintf(orte_xml_fp, "
</stderr>"); } fprintf(orte_xml_fp, "\n"); } } } /* flag that the event lib should no longer be looped * so we will exit */ orte_event_base_active = false; /* break out of the event loop */ opal_event_base_loopbreak(orte_event_base); }