src/fifo.c
changeset 176 6750d50ee8cd
parent 161 d229e4668476
--- a/src/fifo.c	Thu May 07 02:12:55 2009 +0300
+++ b/src/fifo.c	Thu May 07 02:13:50 2009 +0300
@@ -25,17 +25,6 @@
 };
 
 /**
- * Get a sock_fd pointer from a sock_fifo pointer
- */
-#define FIFO_FD(sock_ptr) (&(sock_ptr)->base_fd)
-
-/**
- * Get a sock_base pointer from a sock_fifo pointer
- */
-#define FIFO_TRANSPORT(sock_ptr) TRANSPORT_FD_BASE(FIFO_FD(sock_ptr))
-
-
-/**
  * (re)open the fifo, closing it if already open, and keeping any event callbacks registered.
  */
 static err_t fifo_open (struct fifo *fifo, error_t *err)
@@ -47,11 +36,11 @@
         RETURN_SET_ERROR_ERRNO(err, ERR_OPEN);
 
     // set the new fd
-    if ((ERROR_CODE(err) = transport_fd_set(FIFO_FD(fifo), _fd)))
+    if ((ERROR_CODE(err) = transport_fd_set(&fifo->base_fd, _fd)))
         return ERROR_CODE(err);
     
     // use default transport event-based behaviour
-    if ((ERROR_CODE(err) = transport_fd_defaults(FIFO_FD(fifo))))
+    if ((ERROR_CODE(err) = transport_fd_defaults(&fifo->base_fd)))
         return ERROR_CODE(err);
 
     // ok
@@ -59,15 +48,17 @@
 }
 
 /**
- * Destroy the fifo, releasing all resources
+ * Deinit the fifo, releasing all resources
  */
-static void fifo_destroy (struct fifo *fifo)
+static void fifo_deinit (struct fifo *fifo)
 {
-    // destroy base
-    transport_fd_destroy(FIFO_FD(fifo));
+    // deinit base
+    transport_fd_deinit(&fifo->base_fd);
 
     // release the path
     free(fifo->path);
+
+    fifo->path = NULL;
 }
 
 /**
@@ -80,7 +71,7 @@
     struct fifo *fifo = transport_check(transport, &fifo_type);
 
     // trap READ_EOF
-    if (transport_fd_methods_read(transport, buf, len, err) != ERR_EOF)
+    if (transport_fd__read(transport, buf, len, err) != ERR_EOF)
         return ERROR_CODE(err);
     
     // re-open it
@@ -100,26 +91,38 @@
 /**
  * sock_stream_methods::release implementation
  */
-static void _fifo_destroy (transport_t *transport)
+static void fifo__deinit (transport_t *transport)
 {
     struct fifo *fifo = transport_check(transport, &fifo_type);
     
-    fifo_destroy(fifo);
+    fifo_deinit(fifo);
 }
 
 /*
  * Our sock_stream_type
  */
 const struct transport_type fifo_type = {
-    .parent                 = &transport_fd_type,
-    .methods                = {
-        .read               = fifo_read,
-        .write              = NULL,
-        .events             = transport_fd_methods_events,
-        .destroy            = _fifo_destroy,
+    .base_type = {
+        .parent     = &transport_fd_type.base_type,
+    },
+    .methods = {
+        .read       = fifo_read,
+        .write      = NULL,
+        .events     = transport_fd__events,
+        .deinit     = fifo__deinit,
     },
 };
 
+/**
+ * Deinit and free
+ */
+static void fifo_destroy (struct fifo *fifo)
+{
+    fifo_deinit(fifo);
+
+    free(fifo);
+}
+
 err_t fifo_open_read (struct transport_info *transport_info, transport_t **transport_ptr, struct event_base *ev_base,
         const char *path, error_t *err)
 {
@@ -134,15 +137,15 @@
         return SET_ERROR(err, ERR_STRDUP);
 
     // init
-    transport_init(FIFO_TRANSPORT(fifo), &fifo_type, transport_info);
-    transport_fd_init(FIFO_FD(fifo), ev_base, TRANSPORT_FD_INVALID);
+    transport_init(&fifo->base_fd.base, &fifo_type, transport_info);
+    transport_fd_init(&fifo->base_fd, ev_base, TRANSPORT_FD_INVALID);
     
     // open the fifo
     if (fifo_open(fifo, err))
         goto error;
 
     // ok
-    *transport_ptr = FIFO_TRANSPORT(fifo);
+    *transport_ptr = &fifo->base_fd.base;
 
     return SUCCESS;