Example #1
0
static void *md_thread(void *arg)
{
    int i,n,r;
    struct _triton_md_handler_t *h;
    sigset_t set;

    sigfillset(&set);
    sigdelset(&set, SIGKILL);
    sigdelset(&set, SIGSTOP);
    pthread_sigmask(SIG_BLOCK, &set, NULL);

    while(1) {
        n = epoll_wait(epoll_fd, epoll_events, max_events, -1);
        if (n < 0) {
            if (errno == EINTR)
                continue;
            triton_log_error("md:epoll_wait: %s", strerror(errno));
            _exit(-1);
        }

        for(i = 0; i < n; i++) {
            h = (struct _triton_md_handler_t *)epoll_events[i].data.ptr;
            if (!h->ud)
                continue;
            spin_lock(&h->ctx->lock);
            if (h->ud) {
                h->trig_epoll_events |= epoll_events[i].events;
                if (!h->pending) {
                    list_add_tail(&h->entry2, &h->ctx->pending_handlers);
                    h->pending = 1;
                    __sync_add_and_fetch(&triton_stat.md_handler_pending, 1);
                    r = triton_queue_ctx(h->ctx);
                } else
                    r = 0;
            } else
                r = 0;
            spin_unlock(&h->ctx->lock);
            if (r)
                triton_thread_wakeup(h->ctx->thread);
        }

        while (!list_empty(&freed_list2)) {
            h = list_entry(freed_list2.next, typeof(*h), entry);
            list_del(&h->entry);
            mempool_free(h);
        }

        pthread_mutex_lock(&freed_list_lock);
        while (!list_empty(&freed_list)) {
            h = list_entry(freed_list.next, typeof(*h), entry);
            list_del(&h->entry);
            list_add(&h->entry, &freed_list2);
        }
        pthread_mutex_unlock(&freed_list_lock);
    }

    return NULL;
}
Example #2
0
static void __config_reload(void (*notify)(int))
{
	struct _triton_thread_t *t;
	int r;

	log_debug2("config_reload: enter\n");
	r = conf_reload(NULL);
	notify(r);

	spin_lock(&threads_lock);
	need_config_reload = 0;
	list_for_each_entry(t, &threads, entry)
		triton_thread_wakeup(t);
	spin_unlock(&threads_lock);
	log_debug2("config_reload: exit\n");
}