src/sock_tcp.c
changeset 11 14e79683c48c
parent 10 9fe218576d13
child 12 4147fae232d9
--- 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