void sig_init(void) { clk_tck_init(); timer_save_interval = cfg_get_int(SECTION_OPTIONS, NULL, "Save"); if (timer_save_interval < 0) timer_save_interval = TIMER_SAVE_DELAY; else if ((timer_save_interval /= TIMER_INTERVAL) <= 0) timer_save_interval = 1; if (cfg_get_param(SECTION_OPTIONS, NULL, "AbortGraceTime")) { abort_grace_time = cfg_get_int(SECTION_OPTIONS, NULL, "AbortGraceTime"); } #if OS_TIMER timer_save_value = timer_save_interval; #elif !defined(BENCH_BUILD) timer_save_value = status_get_time() + timer_save_interval; #endif timer_ticksafety_interval = (clock_t)1 << (sizeof(clock_t) * 8 - 4); timer_ticksafety_interval /= clk_tck; if ((timer_ticksafety_interval /= TIMER_INTERVAL) <= 0) timer_ticksafety_interval = 1; timer_ticksafety_value = timer_ticksafety_interval; atexit(sig_done); sig_install(sig_handle_update, SIGHUP); sig_install_abort(); sig_install_timer(); }
static void sig_handle_update(int signum) { event_reload = event_save = event_pending = 1; #ifndef SA_RESTART sig_install(sig_handle_update, signum); #endif }
void sig_preinit(void) { #ifdef SIGUSR2 sig_remove_reload(); #endif #ifdef SIGUSR1 sig_install(sig_handle_status, SIGUSR1); #endif }
void sig_init_child(void) { #ifdef SIGUSR1 sig_install(sig_handle_status, SIGUSR1); #endif #ifdef SIGUSR2 sig_remove_reload(); #endif #if OS_TIMER sig_init_timer(); #endif }
static void sig_handle_status(int signum) { /* We currently disable --fork for Cygwin in os.h due to problems with proper session save when a job is aborted. This cludge could be a workaround: First press a key, then abort it after status line was printed. */ #if OS_FORK && defined(__CYGWIN32__) && !defined(BENCH_BUILD) if (options.fork) event_save = 1; #endif /* Similar cludge for MPI. Only SIGUSR1 is supported for showing status because the fascist MPI daemons will send us a SIGKILL seconds after a SIGHUP and there's nothing we can do about it. */ #ifdef HAVE_MPI if (mpi_p > 1 || getenv("OMPI_COMM_WORLD_SIZE")) event_save = 1; #endif event_status = event_pending = 1; #ifndef SA_RESTART sig_install(sig_handle_status, signum); #endif }
static void sig_handle_timer(int signum) { int saved_errno = errno; #if !OS_TIMER unsigned int time; #endif #ifndef BENCH_BUILD #if OS_TIMER /* Some stuff only done every few seconds */ if (timer_save_interval < 4 || ((timer_save_interval - timer_save_value) & 3) == 3) { #ifdef HAVE_MPI if (!event_reload && mpi_p > 1) { event_pending = event_mpiprobe = 1; } #endif event_poll_files = event_pending = 1; #ifdef SIGUSR2 sig_install(sig_handle_reload, SIGUSR2); #endif } if (!--timer_save_value) { timer_save_value = timer_save_interval; event_save = event_pending = 1; event_reload = options.reload_at_save; } if (timer_abort && !--timer_abort) { aborted_by_timer = 1; if (abort_grace_time > 0) timer_abort = abort_grace_time; else if (abort_grace_time < 0) timer_abort = 0; else /* no grace time, kill immediately */ event_abort = 1; sig_handle_abort(0); } if (timer_status && !--timer_status) { timer_status = options.status_interval; event_status = event_pending = 1; } #else /* no OS_TIMER */ time = status_get_time(); /* Some stuff only done every few seconds */ if ((time & 3) == 3) { #ifdef HAVE_MPI if (!event_reload && mpi_p > 1) { event_pending = event_mpiprobe = 1; } #endif event_poll_files = event_pending = 1; #ifdef SIGUSR2 sig_install(sig_handle_reload, SIGUSR2); #endif } if (time >= timer_save_value) { timer_save_value += timer_save_interval; event_save = event_pending = 1; event_reload = options.reload_at_save; } if (timer_abort && time >= timer_abort) { aborted_by_timer = 1; if (abort_grace_time > 0) timer_abort += abort_grace_time; else if (abort_grace_time < 0) timer_abort = 0; else /* no grace time, kill immediately */ event_abort = 1; sig_handle_abort(0); } if (timer_status && time >= timer_status) { timer_status += options.status_interval; event_status = event_pending = 1; } #endif /* OS_TIMER */ #endif /* !BENCH_BUILD */ if (!--timer_ticksafety_value) { timer_ticksafety_value = timer_ticksafety_interval; event_ticksafety = event_pending = 1; } #ifndef HAVE_MPI if (john_main_process) #endif { int c; #if OS_FORK int new_abort = 0, new_status = 0; #endif while ((c = tty_getchar()) >= 0) { if (c == 3 || c == 'q') { #if OS_FORK new_abort = 1; #endif sig_handle_abort(0); } else { #if OS_FORK new_status = 1; #endif event_status = event_pending = 1; } } #if OS_FORK if (new_abort || new_status) signal_children(new_abort ? SIGTERM : SIGUSR1); #endif } #if !OS_TIMER signal(SIGALRM, sig_handle_timer); #elif !defined(SA_RESTART) && !defined(__DJGPP__) sig_install_timer(); #endif errno = saved_errno; }
int begin(int argc, char *argv[]) { int i, j; uint32_t ph_flags = 0; thread_pool_attr_t tp_attr; static void *tpp; dispatch_t *dpp; dpp = dispatch_create(); if (dpp == NULL) { char * pMsgTxt = "Error: cannot create dispatch interface\n"; fprintf(stderr, pMsgTxt); slogf(_SLOG_SETCODE(_SLOGC_INPUT, 0), _SLOG_ERROR, pMsgTxt); return (EXIT_FAILURE); } devi_set_dispatch_handle(dpp); /* set up the module table */ if (modules != NULL) { for (i = 0; i < MODULE_TABLE_SIZE && ModuleTable[i] != NULL; i++) ; /* add extra modules to end of ModuleTable */ for (j = 0; j < (MODULE_TABLE_SIZE - i) && modules[j] != NULL; j++, i++) ModuleTable[i] = modules[j]; } if(ThreadCtl(_NTO_TCTL_IO, 0) == -1) { errno_print("ThreadCtl"); return (EXIT_FAILURE); } // Call global callback if it was specified if(commonCallbacks.pre_init && commonCallbacks.pre_init()) return (EXIT_FAILURE); if (options(argc, argv, &ph_flags, &OptFlags) < 0) return (EXIT_FAILURE); // Call global callback if it was specified if(commonCallbacks.post_init && commonCallbacks.post_init()) return (EXIT_FAILURE); sig_install(signal_table, termination_hndlr); if (procmgr_daemon(0, PROCMGR_DAEMON_NODEVNULL | PROCMGR_DAEMON_NOCLOSE) < 0) { errno_print("procmgr_daemon"); return (EXIT_FAILURE); } if (!(OptFlags & OPT_NO_PHOTON)) { if (start_photon_interface(ph_flags) < 0) { errno_print("unable to start photon interface"); return (EXIT_FAILURE); } } memset(&tp_attr, 0, sizeof(tp_attr)); tp_attr.handle = devi_get_dispatch_handle(); tp_attr.context_alloc = dispatch_context_alloc; tp_attr.block_func = dispatch_block; tp_attr.handler_func = dispatch_handler; tp_attr.context_free = dispatch_context_free; /* We'd rather not to use thread pool for device driver - it could cause desynchronizing and data losing */ tp_attr.lo_water = 1; /* min amount threads waiting blocked */ tp_attr.hi_water = 1; /* max amount threads waiting blocked */ tp_attr.increment = 1; tp_attr.maximum = 1; tpp = thread_pool_create(&tp_attr, POOL_FLAG_USE_SELF); if (tpp == NULL) { errno_print("thread_pool_create"); return (EXIT_FAILURE); } thread_pool_start(tpp); return (EOK); }