/*----------------------------------------------------------------- * shadowd_exit_func * function installed to be called just before exit() is called. *-----------------------------------------------------------------*/ static void shadowd_exit_func( void **ctx_ref, int i ) { #if defined(SOLARIS) if (sge_smf_used() == 1) { /* We don't do disable on svcadm restart */ if (sge_strnullcmp(sge_smf_get_instance_state(), SCF_STATE_STRING_ONLINE) == 0 && sge_strnullcmp(sge_smf_get_instance_next_state(), SCF_STATE_STRING_NONE) == 0) { sge_smf_temporary_disable_instance(); } } #endif exit(i); }
/*------------------------------------------------------------- * Function installed to be called just before exit() is called. * clean up *-------------------------------------------------------------*/ static void execd_exit_func(void **ctx_ref, int i) { DENTER(TOP_LAYER, "execd_exit_func"); sge_gdi2_shutdown(ctx_ref); /* trigger load sensors shutdown */ sge_ls_stop(0); #ifdef COMPILE_DC ptf_stop(); #endif #if defined(SOLARIS) if (sge_smf_used() == 1) { /* We don't do disable on svcadm restart */ if (sge_strnullcmp(sge_smf_get_instance_state(), SCF_STATE_STRING_ONLINE) == 0 && sge_strnullcmp(sge_smf_get_instance_next_state(), SCF_STATE_STRING_NONE) == 0) { sge_smf_temporary_disable_instance(); } } #endif DEXIT; }
/****** qmaster/sge_qmaster_main/signal_thread() ******************************* * NAME * signal_thread() -- signal thread function * * SYNOPSIS * void* signal_thread(void* anArg) * * FUNCTION * Signal handling thread function. Establish recognized signal set. Enter * signal wait loop. Wait for signal. Handle signal. * * If signal is 'SIGINT' or 'SIGTERM', kick-off shutdown and invalidate * signal thread. * * NOTE: The signal thread will terminate on return of this function. * * INPUTS * void* anArg - not used * * RESULT * void* - none * * NOTES * MT-NOTE: signal_thread() is a thread function. Do NOT use this function * MT-NOTE: in any other way! * *******************************************************************************/ void* sge_signaler_main(void* arg) { cl_thread_settings_t *thread_config = (cl_thread_settings_t*)arg; bool is_continue = true; sigset_t sig_set; int sig_num; time_t next_prof_output = 0; monitoring_t monitor; sge_gdi_ctx_class_t *ctx = NULL; DENTER(TOP_LAYER, "sge_signaler_main"); cl_thread_func_startup(thread_config); sge_monitor_init(&monitor, thread_config->thread_name, NONE_EXT, ST_WARNING, ST_ERROR); sge_qmaster_thread_init(&ctx, QMASTER, SIGNALER_THREAD, true); sigemptyset(&sig_set); sigaddset(&sig_set, SIGINT); sigaddset(&sig_set, SIGTERM); /* register at profiling module */ set_thread_name(pthread_self(), "Signal Thread"); conf_update_thread_profiling("Signal Thread"); while (is_continue) { /* * Wait for signals */ sigwait(&sig_set, &sig_num); thread_start_stop_profiling(); DPRINTF(("got signal %d\n", sig_num)); switch (sig_num) { case SIGINT: case SIGTERM: /* * Notify the main thread. It is waiting and will shutdown all other * threads if it gets signalled */ sge_thread_notify_all_waiting(); #if defined(SOLARIS) if (sge_smf_used() == 1) { /* We don't do disable on svcadm restart */ if (sge_strnullcmp(sge_smf_get_instance_state(), SCF_STATE_STRING_ONLINE) == 0 && sge_strnullcmp(sge_smf_get_instance_next_state(), SCF_STATE_STRING_NONE) == 0) { sge_smf_temporary_disable_instance(); } } #endif /* * Now this thread can exit. The main thread does the remaining * shutdown activities */ is_continue = false; break; default: ERROR((SGE_EVENT, MSG_QMASTER_UNEXPECTED_SIGNAL_I, sig_num)); } sge_monitor_output(&monitor); thread_output_profiling("signal thread profiling summary:\n", &next_prof_output); } sge_monitor_free(&monitor); DRETURN(NULL); }