--- 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 <assert.h>
/*
+ * 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