Ejemplo n.º 1
0
static void
signal_cb(uv_signal_t *handle, int signum) {
    if (signum == SIGINT || signum == SIGQUIT) {
        char *name = signum == SIGINT ? "SIGINT" : "SIGQUIT";
        logger_log(LOG_INFO, "Received %s, scheduling shutdown...", name);

        close_signal();

        if (concurrency > 1) {
            struct server_context *servers = handle->data;
            for (int i = 0; i < concurrency; i++) {
                struct server_context *server = &servers[i];
                uv_async_send(&server->async_handle);
            }

        } else {
            struct server_context *ctx = handle->data;
            uv_close((uv_handle_t *)&ctx->tcp, NULL);
            udprelay_close(ctx);
        }

    }
    if (signum == SIGTERM) {
        logger_log(LOG_INFO, "Received SIGTERM, scheduling shutdown...");
        if (daemon_mode) {
            delete_pidfile(pidfile);
        }
        exit(0);
    }
}
Ejemplo n.º 2
0
static void
consumer_close(uv_async_t *handle) {
    struct server_context *server = container_of(handle, struct server_context, async_handle);

    uv_close((uv_handle_t*) &server->tcp, NULL);
    uv_close((uv_handle_t*) &server->async_handle, NULL);

    if (server->udprelay) {
        udprelay_close(server);
    }

    if (server->nameserver_num >= 0) {
        struct resolver_context *res = handle->loop->data;
        resolver_shutdown(res);
    }
}