static int lcb_io_update_timer(struct lcb_io_opt_st *iops, void *timer, lcb_uint32_t usec, void *cb_data, void (*handler)(lcb_socket_t sock, short which, void *cb_data)) { short flags = EV_TIMEOUT | EV_PERSIST; struct timeval tmo; if (flags == event_get_events(timer) && handler == event_get_callback(timer)) { /* no change! */ return 0; } if (event_pending(timer, EV_TIMEOUT, 0)) { event_del(timer); } event_assign(timer, ((struct libevent_cookie *)iops->v.v2.cookie)->base, -1, flags, handler, cb_data); tmo.tv_sec = usec / 1000000; tmo.tv_usec = usec % 1000000; return event_add(timer, &tmo); }
int main() { pipe(pp); struct event_base *base = event_base_new(); evr = event_new(base, pp[0], EV_READ, read_cb, NULL); evw = event_new(base, pp[1], EV_WRITE | EV_TIMEOUT, write_cb, NULL); event_add(evw, NULL); event_add(evr, NULL); struct event_base *outbase; int fdout; event_get_assignment(evw, NULL, &fdout, NULL, NULL, NULL); /* Note fdout. */ outbase = event_get_base(evw); /* outbase == base */ event_callback_fn cb = event_get_callback(evw); assert(write_cb == cb); assert(NULL == event_get_callback_arg(evw)); assert(EV_WRITE|EV_TIMEOUT == event_get_events(evw)); assert(pp[1] == event_get_fd(evw)); assert(event_initialized(evw) == 1); test_num_events(); event_base_dispatch(base); return 0; }
static int lcb_io_update_event(struct lcb_io_opt_st *iops, lcb_socket_t sock, void *event, short flags, void *cb_data, void (*handler)(lcb_socket_t sock, short which, void *cb_data)) { flags |= EV_PERSIST; if (flags == event_get_events(event) && handler == event_get_callback(event)) { /* no change! */ return 0; } if (event_pending(event, EV_READ | EV_WRITE, 0)) { event_del(event); } event_assign(event, ((struct libevent_cookie *)iops->v.v2.cookie)->base, sock, flags, handler, cb_data); return event_add(event, NULL); }
int rs_packet_send (struct rs_packet *pkt, void *user_data) { struct rs_connection *conn = NULL; int err = 0; assert (pkt); assert (pkt->conn); conn = pkt->conn; if (_conn_is_open_p (conn)) packet_do_send (pkt); else if (_conn_open (conn, pkt)) return -1; assert (conn->evb); assert (conn->active_peer); assert (conn->fd >= 0); conn->user_data = user_data; if (conn->bev) /* TCP */ { bufferevent_setcb (conn->bev, NULL, tcp_write_cb, tcp_event_cb, pkt); bufferevent_enable (conn->bev, EV_WRITE); } else /* UDP */ { event_assign (conn->wev, conn->evb, event_get_fd (conn->wev), EV_WRITE, event_get_callback (conn->wev), pkt); err = event_add (conn->wev, NULL); if (err < 0) return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__, "event_add: %s", evutil_gai_strerror (err)); } /* Do dispatch, unless the user wants to do it herself. */ if (!conn_user_dispatch_p (conn)) { conn->callbacks.sent_cb = _wcb; conn->user_data = pkt; rs_debug (("%s: entering event loop\n", __func__)); err = event_base_dispatch (conn->evb); if (err < 0) return rs_err_conn_push_fl (conn, RSE_EVENT, __FILE__, __LINE__, "event_base_dispatch: %s", evutil_gai_strerror (err)); rs_debug (("%s: event loop done\n", __func__)); conn->callbacks.sent_cb = NULL; conn->user_data = NULL; if ((pkt->flags & RS_PACKET_SENT) == 0) { assert (rs_err_conn_peek_code (conn)); return rs_err_conn_peek_code (conn); } } return RSE_OK; }