bool daemon_backend::stop() { send_stop_signal(); if(m_main_worker_thread.joinable()) m_main_worker_thread.join(); return true; }
//----------------------------------------------------------------------------------------------------- bool miner::stop() { send_stop_signal(); std::lock_guard<std::mutex> lk(m_threads_lock); for (auto& th : m_threads) { th.join(); } m_threads.clear(); logger(INFO) << "Mining has been stopped, " << m_threads.size() << " finished" ; return true; }
int main(int argc, char *argv[]) { signed char c; random_init(); install_handler(SIGINT, handle_signal); install_handler(SIGTERM, handle_signal); install_handler(SIGQUIT, handle_signal); install_handler(SIGCHLD, handle_signal); install_handler(SIGHUP, handle_signal); debug_config(argv[0]); while(((c = getopt(argc, argv, "+d:o:O:m:M:s:S:vh")) > -1)) { switch (c) { case 'c': check_interval = string_time_parse(optarg); break; case 'd': debug_flags_set(optarg); break; case 'o': debug_config_file(optarg); break; case 'O': debug_config_file_size(string_metric_parse(optarg)); break; case 'm': min_wait_time = string_time_parse(optarg); break; case 'M': max_wait_time = string_time_parse(optarg); break; case 's': start_interval = string_time_parse(optarg); break; case 'S': stop_interval = string_time_parse(optarg); break; case 'v': cctools_version_print(stdout, argv[0]); exit(0); break; case 'h': default: show_help(argv[0]); break; } } cctools_version_debug(D_DEBUG, argv[0]); if(optind >= argc) { show_help(argv[0]); return 1; } program_argv = &argv[optind]; state_start = time(0); state = STATE_READY; if(program_argv[0][0] != '/') { fprintf(stderr, "watchdog: please give me the full path to %s\n", program_argv[0]); return 1; } while(1) { time_t time_in_state = time(0) - state_start; switch (state) { case STATE_READY: if(start_program()) { change_state(STATE_STARTED); } else { change_state(STATE_STOPPED); start_failures++; } break; case STATE_STARTED: if(program_exited()) { change_state(STATE_STOPPED); start_failures++; } else if(time_in_state > start_interval) { change_state(STATE_RUNNING); } else if(want_to_exit) { change_state(STATE_STOP_WAIT); } break; case STATE_RUNNING: start_failures = 0; if(program_exited()) { change_state(STATE_STOPPED); } else if(program_changed()) { change_state(STATE_STOP_WAIT); } else if(want_to_exit) { change_state(STATE_STOP_WAIT); } break; case STATE_STOP_WAIT: send_stop_signal(); if(program_exited()) { change_state(STATE_STOPPED); } else if(time_in_state > stop_interval) { change_state(STATE_KILL_WAIT); } break; case STATE_KILL_WAIT: send_kill_signal(); if(program_exited()) { change_state(STATE_STOPPED); } break; case STATE_STOPPED: if(want_to_exit) { debug(D_DEBUG, "all done"); exit(0); } else { unsigned int wait_time; int i; wait_time = min_wait_time; for(i = 0; i < start_failures; i++) { wait_time *= 2; } if(wait_time > max_wait_time || wait_time < min_wait_time) { wait_time = max_wait_time; } if(time_in_state >= (int) wait_time) { change_state(STATE_READY); } } break; default: fatal("invalid state %d!\n", state); break; } if(state_changes == 0) { sleep(5); } else { state_changes = 0; } } return 1; }