/** * Run engine, run!. * */ static void engine_run(engine_type* engine, int single_run) { if (!engine) { return; } engine_start_workers(engine); engine_start_drudgers(engine); lock_basic_lock(&engine->signal_lock); engine->signal = SIGNAL_RUN; lock_basic_unlock(&engine->signal_lock); while (!engine->need_to_exit && !engine->need_to_reload) { lock_basic_lock(&engine->signal_lock); engine->signal = signal_capture(engine->signal); switch (engine->signal) { case SIGNAL_RUN: ods_log_assert(1); break; case SIGNAL_RELOAD: engine->need_to_reload = 1; break; case SIGNAL_SHUTDOWN: engine->need_to_exit = 1; break; default: ods_log_warning("[%s] invalid signal %d captured, " "keep running", engine_str, signal); engine->signal = SIGNAL_RUN; break; } lock_basic_unlock(&engine->signal_lock); if (single_run) { engine->need_to_exit = engine_all_zones_processed(engine); } lock_basic_lock(&engine->signal_lock); if (engine->signal == SIGNAL_RUN && !single_run) { ods_log_debug("[%s] taking a break", engine_str); lock_basic_sleep(&engine->signal_cond, &engine->signal_lock, 3600); } lock_basic_unlock(&engine->signal_lock); } ods_log_debug("[%s] signer halted", engine_str); engine_stop_drudgers(engine); engine_stop_workers(engine); (void)lhsm_reopen(engine->config->cfg_filename); return; }
/** * Update the repositorylist * \param sockfd. Client to print to. * \param engine. Main daemon state * \return 1 on success, 0 on failure. */ static int perform_update_repositorylist(int sockfd, engine_type* engine) { const char* cfgfile = ODS_SE_CFGFILE; int status = 1; hsm_repository_t* new_reps; if (validate_configfile(cfgfile)) { ods_log_error_and_printf(sockfd, module_str, "Unable to validate '%s' consistency.", cfgfile); return 0; } /* key gen tasks must be stopped, hsm connections must be closed * easiest way is to stop all workers, */ pthread_mutex_lock(&engine->signal_lock); /** we have got the lock, daemon thread is not going anywhere * we can safely stop all workers */ engine_stop_workers(engine); new_reps = parse_conf_repositories(cfgfile); if (!new_reps) { /* revert */ status = 0; client_printf(sockfd, "Could not load new repositories. Will continue with old.\n"); } else { /* succes */ hsm_repository_free(engine->config->repositories); engine->config->repositories = new_reps; engine->need_to_reload = 1; client_printf(sockfd, "new repositories parsed successful.\n"); client_printf(sockfd, "Notifying enforcer of new respositories.\n"); /* kick daemon thread so it will reload the hsms */ pthread_cond_signal(&engine->signal_cond); } engine_start_workers(engine); pthread_mutex_unlock(&engine->signal_lock); return status; }
/** * Run engine, run!. * */ static void engine_run(engine_type* engine, start_cb_t start, int single_run) { if (!engine) { return; } ods_log_assert(engine); engine_start_workers(engine); engine_start_drudgers(engine); lock_basic_lock(&engine->signal_lock); /* [LOCK] signal */ engine->signal = SIGNAL_RUN; /* [UNLOCK] signal */ lock_basic_unlock(&engine->signal_lock); /* call the external start callback function */ start(engine); while (!engine->need_to_exit && !engine->need_to_reload) { lock_basic_lock(&engine->signal_lock); /* [LOCK] signal */ engine->signal = signal_capture(engine->signal); switch (engine->signal) { case SIGNAL_RUN: ods_log_assert(1); break; case SIGNAL_RELOAD: engine->need_to_reload = 1; break; case SIGNAL_SHUTDOWN: engine->need_to_exit = 1; break; default: ods_log_warning("[%s] invalid signal captured: %d, " "keep running", engine_str, signal); engine->signal = SIGNAL_RUN; break; } /* [UNLOCK] signal */ lock_basic_unlock(&engine->signal_lock); if (single_run) { engine->need_to_exit = 1; /* FIXME: all tasks need to terminate, then set need_to_exit to 1 */ } lock_basic_lock(&engine->signal_lock); /* [LOCK] signal */ if (engine->signal == SIGNAL_RUN && !single_run) { ods_log_debug("[%s] taking a break", engine_str); lock_basic_sleep(&engine->signal_cond, &engine->signal_lock, 3600); } /* [UNLOCK] signal */ lock_basic_unlock(&engine->signal_lock); } ods_log_debug("[%s] enforcer halted", engine_str); engine_stop_drudgers(engine); engine_stop_workers(engine); return; }