Example #1
0
/*
 * 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;
}
Example #2
0
/* 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;
}
Example #3
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;
}