diff -r 9fe218576d13 -r 14e79683c48c src/sock_tcp.c --- a/src/sock_tcp.c Sun Feb 22 10:16:28 2009 +0200 +++ b/src/sock_tcp.c Sat Feb 28 17:39:37 2009 +0200 @@ -11,6 +11,21 @@ #include /* + * Our basic socket event handler for driving our callbacks + */ +static void sock_tcp_event_handler (evutil_socket_t fd, short what, void *arg) +{ + struct sock_tcp *sock = arg; + + // invoke appropriate callback + if (what & EV_READ && SOCK_TCP_BASE(sock)->cb_info->on_read) + SOCK_TCP_BASE(sock)->cb_info->on_read(SOCK_TCP_BASE(sock), SOCK_TCP_BASE(sock)->cb_arg); + + if (what & EV_WRITE && SOCK_TCP_BASE(sock)->cb_info->on_write) + SOCK_TCP_BASE(sock)->cb_info->on_read(SOCK_TCP_BASE(sock), SOCK_TCP_BASE(sock)->cb_arg); +} + +/* * Our sock_stream_methods.read method */ static err_t sock_tcp_read (struct sock_stream *base_sock, void *buf, size_t *len) @@ -51,14 +66,32 @@ static err_t sock_tcp_event_init (struct sock_stream *base_sock) { struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); + err_t err; + + // set nonblocking + if ((err = sock_tcp_set_nonblock(sock, 1))) + return err; + + // add ourselves as the event handler + if ((err = sock_tcp_init_ev(sock, &sock_tcp_event_handler, sock))) + return err; + // done return SUCCESS; } static err_t sock_tcp_event_enable (struct sock_stream *base_sock, short mask) { struct sock_tcp *sock = SOCK_FROM_BASE(base_sock, struct sock_tcp); + + // just add the appropraite events + if (mask & EV_READ && event_add(sock->ev_read, NULL)) + return SET_ERROR(SOCK_TCP_ERR(sock), ERR_EVENT_ADD); + + if (mask & EV_WRITE && event_add(sock->ev_write, NULL)) + return SET_ERROR(SOCK_TCP_ERR(sock), ERR_EVENT_ADD); + // done return SUCCESS; } @@ -72,21 +105,6 @@ .methods.event_enable = &sock_tcp_event_enable, }; -/* - * Our basic socket event handler for driving our callbacks - */ -static void sock_tcp_event (evutil_socket_t fd, short what, void *arg) -{ - struct sock_tcp *sock = arg; - - // invoke appropriate callback - if (what & EV_READ && SOCK_TCP_BASE(sock)->cb_info->on_read) - SOCK_TCP_BASE(sock)->cb_info->on_read(SOCK_TCP_BASE(sock), SOCK_TCP_BASE(sock)->cb_arg); - - if (what & EV_WRITE && SOCK_TCP_BASE(sock)->cb_info->on_write) - SOCK_TCP_BASE(sock)->cb_info->on_read(SOCK_TCP_BASE(sock), SOCK_TCP_BASE(sock)->cb_arg); -} - err_t sock_tcp_alloc (struct sock_tcp **sock_ptr) { // alloc @@ -116,9 +134,15 @@ { // require valid fd assert(sock->fd >= 0); + + // this is initialization + assert(sock->ev_read == NULL && sock->ev_write == NULL); // create new event - if ((sock->ev = event_new(_sock_stream_ctx.ev_base, sock->fd, EV_READ, ev_cb, cb_arg)) == NULL) + if ((sock->ev_read = event_new(_sock_stream_ctx.ev_base, sock->fd, EV_READ, ev_cb, cb_arg)) == NULL) + return SET_ERROR(SOCK_TCP_ERR(sock), ERR_EVENT_NEW); + + if ((sock->ev_write = event_new(_sock_stream_ctx.ev_base, sock->fd, EV_WRITE, ev_cb, cb_arg)) == NULL) return SET_ERROR(SOCK_TCP_ERR(sock), ERR_EVENT_NEW); // ok