Exemple #1
0
/**
 * 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);
}
Exemple #2
0
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();
}
Exemple #3
0
/**
 * 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;
}
Exemple #4
0
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;
}