gallus_result_t gallus_module_shutdown_all(shutdown_grace_level_t level) { gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES; if (IS_VALID_SHUTDOWN(level) == true) { s_lock(); { s_gstate = MODULE_GLOBAL_STATE_SHUTTINGDOWN; if (s_n_modules > 0) { gallus_result_t first_err = GALLUS_RESULT_OK; size_t i; a_module *mptr; /* * Reverse order. */ for (i = 0; i < s_n_modules; i++) { mptr = &(s_modules[s_n_modules - i - 1]); ret = s_shutdown_module(mptr, level); if (ret != GALLUS_RESULT_OK) { gallus_perror(ret); gallus_msg_error("can't shutdown module \"%s\".\n", mptr->m_name); if (first_err == GALLUS_RESULT_OK) { first_err = ret; } } /* * Just carry on shutting down no matter what kind of errors * occur. */ } ret = first_err; } else { ret = GALLUS_RESULT_OK; } } s_unlock(); } else { ret = GALLUS_RESULT_INVALID_ARGS; } return ret; }
static inline gallus_result_t s_null_create(null_thread_t *nptr, shutdown_grace_level_t l) { gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES; if (IS_VALID_SHUTDOWN(l) == true && nptr != NULL) { null_thread_t nt; if (*nptr != NULL) { nt = *nptr; } else { if ((nt = (null_thread_t)malloc(sizeof(*nt))) == NULL) { ret = GALLUS_RESULT_NO_MEMORY; goto done; } } if ((ret = gallus_thread_create((gallus_thread_t *)&nt, s_main, s_finalize, NULL, "null", NULL)) == GALLUS_RESULT_OK) { if (*nptr == NULL) { (void)gallus_thread_free_when_destroy((gallus_thread_t *)&nt); *nptr = nt; } nt->m_gl = l; ret = GALLUS_RESULT_OK; } else { if (*nptr == NULL) { free((void *)nt); } } } else { ret = GALLUS_RESULT_INVALID_ARGS; } done: return ret; }
lagopus_result_t global_state_request_shutdown(shutdown_grace_level_t l) { lagopus_result_t ret = LAGOPUS_RESULT_ANY_FAILURES; if (IS_VALID_SHUTDOWN(l) == true) { s_lock(); { if (IS_GLOBAL_STATE_SHUTDOWN(s_gs) == false && s_gs != GLOBAL_STATE_REQUEST_SHUTDOWN) { if (s_is_valid_state(GLOBAL_STATE_REQUEST_SHUTDOWN) == true) { s_gs = GLOBAL_STATE_REQUEST_SHUTDOWN; s_gl = l; (void)lagopus_cond_notify(&s_cond, true); /* * Wait until someone changes the state to * GLOBAL_STATE_ACCEPT_SHUTDOWN */ recheck: if (IS_GLOBAL_STATE_SHUTDOWN(s_gs) == false) { if ((ret = lagopus_cond_wait(&s_cond, &s_lck, -1LL)) == LAGOPUS_RESULT_OK) { goto recheck; } } } else { ret = LAGOPUS_RESULT_INVALID_STATE_TRANSITION; } } } s_unlock(); } else { ret = LAGOPUS_RESULT_INVALID_ARGS; } return ret; }
static inline gallus_result_t s_shutdown_module(a_module *mptr, shutdown_grace_level_t level) { gallus_result_t ret = GALLUS_RESULT_ANY_FAILURES; if (mptr != NULL && mptr->m_shutdown_proc != NULL && IS_VALID_SHUTDOWN(level) == true) { if (mptr->m_status == MODULE_STATE_STARTED) { ret = (mptr->m_shutdown_proc)(level); if (mptr->m_thdptr == NULL) { /* * Means that this module doesn't have any gallus'd threads * nor pthreads. Just change the state to shutdwon. */ mptr->m_status = MODULE_STATE_SHUTDOWN; } #if 0 else { /* * Note that we don't update the module status. */ } #endif } else { if (mptr->m_status == MODULE_STATE_SHUTDOWN || mptr->m_status == MODULE_STATE_STOPPED) { ret = GALLUS_RESULT_OK; } else { ret = GALLUS_RESULT_INVALID_STATE_TRANSITION; } } } else { ret = GALLUS_RESULT_INVALID_ARGS; } return ret; }
static void s_term_handler(int sig) { lagopus_result_t r = LAGOPUS_RESULT_ANY_FAILURES; global_state_t gs = GLOBAL_STATE_UNKNOWN; if ((r = global_state_get(&gs)) == LAGOPUS_RESULT_OK) { if ((int)gs == (int)GLOBAL_STATE_STARTED) { shutdown_grace_level_t l = SHUTDOWN_UNKNOWN; if (sig == SIGTERM || sig == SIGINT) { l = SHUTDOWN_GRACEFULLY; } else if (sig == SIGQUIT) { l = SHUTDOWN_RIGHT_NOW; } if (IS_VALID_SHUTDOWN(l) == true) { lagopus_msg_info("About to request shutdown(%s)...\n", (l == SHUTDOWN_RIGHT_NOW) ? "RIGHT_NOW" : "GRACEFULLY"); if ((r = global_state_request_shutdown(l)) == LAGOPUS_RESULT_OK) { lagopus_msg_info("The shutdown request accepted.\n"); } else { lagopus_perror(r); lagopus_msg_error("can't request shutdown.\n"); } } } else if ((int)gs < (int)GLOBAL_STATE_STARTED) { if (sig == SIGTERM || sig == SIGINT || sig == SIGQUIT) { s_got_term_sig = true; } } else { lagopus_msg_debug(5, "The system is already shutting down.\n"); } } }