static void eventer_ports_impl_add(eventer_t e) { mtevAssert(e->mask); ev_lock_state_t lockstate; const char *cbname; cbname = eventer_name_for_callback_e(e->callback, e); if(e->mask & EVENTER_ASYNCH) { mtevL(eventer_deb, "debug: eventer_add asynch (%s)\n", cbname ? cbname : "???"); eventer_add_asynch(NULL, e); return; } /* Recurrent delegation */ if(e->mask & EVENTER_RECURRENT) { mtevL(eventer_deb, "debug: eventer_add recurrent (%s)\n", cbname ? cbname : "???"); eventer_add_recurrent(e); return; } /* Timed events are simple */ if(e->mask & EVENTER_TIMER) { eventer_add_timed(e); return; } /* file descriptor event */ mtevL(eventer_deb, "debug: eventer_add fd (%s,%d,0x%04x)\n", cbname ? cbname : "???", e->fd, e->mask); lockstate = acquire_master_fd(e->fd); mtevAssert(e->whence.tv_sec == 0 && e->whence.tv_usec == 0); master_fds[e->fd].e = e; alter_fd(e, e->mask); release_master_fd(e->fd, lockstate); }
void noit_metric_director_init() { nthreads = eventer_loop_concurrency(); mtevAssert(nthreads > 0); thread_queues = calloc(sizeof(*thread_queues),nthreads); check_interests = calloc(sizeof(*check_interests),nthreads); if(mtev_fq_handle_message_hook_register_available()) mtev_fq_handle_message_hook_register("metric-director", handle_fq_message, NULL); mtev_log_line_hook_register("metric-director", handle_log_line, NULL); eventer_t e = eventer_alloc(); e->mask = EVENTER_TIMER; e->callback = prune_old_dedupe_hashes; mtev_gettimeofday(&e->whence, NULL); e->whence.tv_sec += 2; eventer_add_timed(e); }
static void eventer_epoll_impl_add(eventer_t e) { int rv; struct epoll_spec *spec; struct epoll_event _ev; ev_lock_state_t lockstate; mtevAssert(e->mask); if(e->mask & EVENTER_ASYNCH) { eventer_add_asynch(NULL, e); return; } /* Recurrent delegation */ if(e->mask & EVENTER_RECURRENT) { eventer_add_recurrent(e); return; } /* Timed events are simple */ if(e->mask & EVENTER_TIMER) { eventer_add_timed(e); return; } spec = eventer_get_spec_for_event(e); /* file descriptor event */ mtevAssert(e->whence.tv_sec == 0 && e->whence.tv_usec == 0); memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; if(e->mask & EVENTER_READ) _ev.events |= (EPOLLIN|EPOLLPRI); if(e->mask & EVENTER_WRITE) _ev.events |= (EPOLLOUT); if(e->mask & EVENTER_EXCEPTION) _ev.events |= (EPOLLERR|EPOLLHUP); lockstate = acquire_master_fd(e->fd); master_fds[e->fd].e = e; mtevL(eventer_deb, "epoll_ctl(%d, add, %d)\n", spec->epoll_fd, e->fd); rv = epoll_ctl(spec->epoll_fd, EPOLL_CTL_ADD, e->fd, &_ev); if(rv != 0) { mtevFatal(mtev_error, "epoll_ctl(%d,add,%d,%x) -> %d (%d: %s)\n", spec->epoll_fd, e->fd, e->mask, rv, errno, strerror(errno)); } release_master_fd(e->fd, lockstate); }
static void eventer_kqueue_impl_add(eventer_t e) { mtevAssert(e->mask); mtevAssert(eventer_is_loop(e->thr_owner) >= 0); ev_lock_state_t lockstate; const char *cbname; cbname = eventer_name_for_callback_e(e->callback, e); if(e->mask & EVENTER_ASYNCH) { mtevL(eventer_deb, "debug: eventer_add asynch (%s)\n", cbname ? cbname : "???"); eventer_add_asynch(NULL, e); return; } /* Recurrent delegation */ if(e->mask & EVENTER_RECURRENT) { mtevL(eventer_deb, "debug: eventer_add recurrent (%s)\n", cbname ? cbname : "???"); eventer_add_recurrent(e); return; } /* Timed events are simple */ if(e->mask & EVENTER_TIMER) { eventer_add_timed(e); return; } /* file descriptor event */ mtevL(eventer_deb, "debug: eventer_add fd (%s,%d,0x%04x)\n", cbname ? cbname : "???", e->fd, e->mask); mtevAssert(e->whence.tv_sec == 0 && e->whence.tv_usec == 0); lockstate = acquire_master_fd(e->fd); master_fds[e->fd].e = e; if(e->mask & (EVENTER_READ | EVENTER_EXCEPTION)) ke_change(e->fd, EVFILT_READ, EV_ADD | EV_ENABLE, e); if(e->mask & (EVENTER_WRITE)) ke_change(e->fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, e); release_master_fd(e->fd, lockstate); }
static void eventer_epoll_impl_add(eventer_t e) { struct epoll_event _ev; ev_lock_state_t lockstate; assert(e->mask); if(e->mask & EVENTER_ASYNCH) { eventer_add_asynch(NULL, e); return; } /* Recurrent delegation */ if(e->mask & EVENTER_RECURRENT) { eventer_add_recurrent(e); return; } /* Timed events are simple */ if(e->mask & EVENTER_TIMER) { eventer_add_timed(e); return; } /* file descriptor event */ assert(e->whence.tv_sec == 0 && e->whence.tv_usec == 0); memset(&_ev, 0, sizeof(_ev)); _ev.data.fd = e->fd; if(e->mask & EVENTER_READ) _ev.events |= (EPOLLIN|EPOLLPRI); if(e->mask & EVENTER_WRITE) _ev.events |= (EPOLLOUT); if(e->mask & EVENTER_EXCEPTION) _ev.events |= (EPOLLERR|EPOLLHUP); lockstate = acquire_master_fd(e->fd); master_fds[e->fd].e = e; assert(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, e->fd, &_ev) == 0); release_master_fd(e->fd, lockstate); }