/* * It register certain events for the file descriptor in question, if * the file descriptor have not been registered, create a new entry. */ static inline int _mk_event_add(mk_event_ctx_t *ctx, int fd, int events) { int op; int ret; struct mk_event_fd_state *fds; struct epoll_event event = {0, {0}}; /* Verify the FD status and desired operation */ fds = mk_event_get_state(fd); if (fds->mask == MK_EVENT_EMPTY) { op = EPOLL_CTL_ADD; } else { op = EPOLL_CTL_MOD; } event.data.fd = fd; event.events = EPOLLERR | EPOLLHUP | EPOLLRDHUP; if (events & MK_EVENT_READ) { event.events |= EPOLLIN; } if (events & MK_EVENT_WRITE) { event.events |= EPOLLOUT; } ret = epoll_ctl(ctx->efd, op, fd, &event); if (ret < 0) { mk_libc_error("epoll_ctl"); return -1; } fds->mask = events; return ret; }
/* Register or modify an event */ int mk_event_add(mk_event_loop_t *loop, int fd, int mask, void *data) { int ret; mk_event_ctx_t *ctx; struct mk_event_fd_state *fds; ctx = loop->data; ret = _mk_event_add(ctx, fd, mask); if (ret == -1) { return -1; } fds = mk_event_get_state(fd); fds->mask = mask; fds->data = data; return 0; }
/* Remove an event */ int mk_event_del(mk_event_loop_t *loop, int fd) { int ret; mk_event_ctx_t *ctx; struct mk_event_fd_state *fds; ctx = loop->data; ret = _mk_event_del(ctx, fd); if (ret == -1) { return -1; } fds = mk_event_get_state(fd); fds->mask = MK_EVENT_EMPTY; fds->data = NULL; return 0; }