/** * Clean up engine. * */ void engine_cleanup(engine_type* engine) { size_t i = 0; if (!engine) { return; } if (engine->workers && engine->config) { for (i=0; i < (size_t) engine->config->num_worker_threads; i++) { worker_cleanup(engine->workers[i]); } free(engine->workers); } if (engine->drudgers && engine->config) { for (i=0; i < (size_t) engine->config->num_signer_threads; i++) { worker_cleanup(engine->drudgers[i]); } free(engine->drudgers); } zonelist_cleanup(engine->zonelist); schedule_cleanup(engine->taskq); fifoq_cleanup(engine->signq); cmdhandler_cleanup(engine->cmdhandler); dnshandler_cleanup(engine->dnshandler); xfrhandler_cleanup(engine->xfrhandler); engine_config_cleanup(engine->config); lock_basic_destroy(&engine->signal_lock); lock_basic_off(&engine->signal_cond); free(engine); }
void cleanup_cb(int fd, short events, void *arg) { #if DEBUG g_debug("CLEANUP"); #endif g_hash_table_foreach_remove(g_jobqueue, _clean_up_empty_queue, NULL); g_hash_table_foreach_remove(g_workers, _clean_up_empty_ptr_array, NULL); schedule_cleanup(); }
/** * Clean up engine. * */ void engine_cleanup(engine_type* engine) { size_t i = 0; allocator_type* allocator; cond_basic_type signal_cond; lock_basic_type signal_lock; if (!engine) { return; } allocator = engine->allocator; signal_cond = engine->signal_cond; signal_lock = engine->signal_lock; if (engine->workers && engine->config) { for (i=0; i < (size_t) engine->config->num_worker_threads; i++) { worker_cleanup(engine->workers[i]); } allocator_deallocate(allocator, (void*) engine->workers); } #if HAVE_DRUDGERS if (engine->drudgers && engine->config) { for (i=0; i < (size_t) engine->config->num_signer_threads; i++) { worker_cleanup(engine->drudgers[i]); } allocator_deallocate(allocator, (void*) engine->drudgers); } #endif schedule_cleanup(engine->taskq); fifoq_cleanup(engine->signq); cmdhandler_cleanup(engine->cmdhandler); engine_config_cleanup(engine->config); allocator_deallocate(allocator, (void*) engine); lock_basic_destroy(&signal_lock); lock_basic_off(&signal_cond); allocator_cleanup(allocator); return; }
int main(int argc, char *argv[]) { int nsockets = 0; struct event listeners[10]; parseargs(argc, argv); if (g_foreground == 0) { detach(); g_logfile = fopen(g_logfilename, "a"); g_log_set_default_handler(logger, NULL); } g_handle_base[0] = 'H'; g_handle_base[1] = ':'; if (gethostname(g_handle_base+2, 128-28) != 0) { sprintf(g_handle_base+2, "hostname"); /* TODO: figure out some other unique identifier */ } char *p = strchr(g_handle_base, '.'); if (!p) p = g_handle_base + strlen(g_handle_base); *(p++) = ':'; *p = 0; g_thread_init(NULL); event_init(); //printf("%s %s\n", event_get_version(), event_get_method()); signal(SIGPIPE, SIG_IGN); struct event sig_int, sig_hup, sig_term;/*, sig_pipe;*/ if (g_foreground) { event_set(&sig_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb, &sig_int); event_add(&sig_int, NULL); event_set(&sig_hup, SIGHUP, EV_SIGNAL|EV_PERSIST, signal_cb, &sig_hup); event_add(&sig_hup, NULL); } else { signal(SIGINT, SIG_IGN); signal(SIGHUP, SIG_IGN); } event_set(&sig_term, SIGTERM, EV_SIGNAL|EV_PERSIST, signal_cb, &sig_term); event_add(&sig_term, NULL); /*event_set(&sig_pipe, SIGPIPE, EV_SIGNAL|EV_PERSIST, signal_cb, &sig_pipe); event_add(&sig_pipe, NULL);*/ int s = listen_on(inet_addr(g_bind), g_port); if (s == -1) { perror("failed to listen on port ..."); return -1; } event_set(&listeners[nsockets], s, EV_READ|EV_PERSIST, listener_cb, &listeners[nsockets]); event_add(&listeners[nsockets], NULL); nsockets++; g_message("listening on port %d", g_port); g_clients = g_ptr_array_new(); g_jobs = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)job_free); g_jobqueue = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)g_queue_free); g_uniq_jobs = g_hash_table_new_full(uniq_job_hash, uniq_job_equal, NULL, NULL); g_workers = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify)g_ptr_array_free); schedule_cleanup(); g_message("gearmand running"); event_dispatch(); g_message("gearmand stopped"); g_hash_table_destroy(g_workers); g_hash_table_destroy(g_uniq_jobs); g_hash_table_destroy(g_jobqueue); g_hash_table_destroy(g_jobs); g_ptr_array_free(g_clients, TRUE); freePools(); if (g_foreground == 0) fclose(g_logfile); return 0; }