about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2016-05-26 01:38:26 -0400
committerFedor Indutny <fedor@indutny.com>2016-05-26 01:38:26 -0400
commit563174a6894f4b4bdf3f90b28fde84d5dd6bfee8 (patch)
tree02c89b7e3109eaed7fe70d3f45ac958f96281bd8 /src
parent476e00fb734d0e129edbc6ad1409a87051a3a735 (diff)
downloaduv_link_t-563174a6894f4b4bdf3f90b28fde84d5dd6bfee8.tar.gz
uv_link_t: default alloc_cb/read_cb
Diffstat (limited to 'src')
-rw-r--r--src/common.h12
-rw-r--r--src/uv_link_observer_t.c1
-rw-r--r--src/uv_link_t.c35
3 files changed, 43 insertions, 5 deletions
diff --git a/src/common.h b/src/common.h
index 6d19477..93d101f 100644
--- a/src/common.h
+++ b/src/common.h
@@ -1,9 +1,21 @@
 #ifndef SRC_COMMON_H_
 #define SRC_COMMON_H_
 
+#include <stdio.h>
+#include <stdlib.h>
+
 #include "uv_link_t.h"
 
 #define container_of(ptr, type, member) \
   ((type *) ((char *) (ptr) - offsetof(type, member)))
 
+#define CHECK(VALUE, MESSAGE)                                                \
+    do {                                                                     \
+      if ((VALUE)) break;                                                    \
+      fprintf(stderr, "Assertion failure: " #MESSAGE "\n");                  \
+    } while (0);
+
+#define CHECK_EQ(A, B, MESSAGE) CHECK((A) == (B), MESSAGE)
+#define CHECK_NE(A, B, MESSAGE) CHECK((A) != (B), MESSAGE)
+
 #endif  /* SRC_COMMON_H_ */
diff --git a/src/uv_link_observer_t.c b/src/uv_link_observer_t.c
index 35e6b03..2042dcb 100644
--- a/src/uv_link_observer_t.c
+++ b/src/uv_link_observer_t.c
@@ -91,6 +91,7 @@ int uv_link_observer_init(uv_loop_t* loop,
   observer->target = target;
 
   l = &observer->link;
+
   l->read_start = uv_link_observer_read_start;
   l->read_stop = uv_link_observer_read_stop;
   l->write = uv_link_observer_write;
diff --git a/src/uv_link_t.c b/src/uv_link_t.c
index 0e2111e..548d638 100644
--- a/src/uv_link_t.c
+++ b/src/uv_link_t.c
@@ -1,9 +1,33 @@
+#include <stdlib.h>
 #include <string.h>
 
 #include "common.h"
 
+static void uv_link_def_alloc_cb(uv_link_t* link,
+                                 size_t suggested_size,
+                                 uv_buf_t* buf) {
+  static const size_t kBufferSize = 16 * 1024;
+
+  buf->base = malloc(kBufferSize);
+  buf->len = kBufferSize;
+
+  CHECK_NE(buf->base, NULL, "uv_link_t: alloc_cb failure");
+}
+
+
+static void uv_link_def_read_cb(uv_link_t* link,
+                                ssize_t nread,
+                                const uv_buf_t* buf) {
+  free(buf->base);
+}
+
+
 int uv_link_init(uv_loop_t* loop, uv_link_t* link) {
   memset(link, 0, sizeof(*link));
+
+  link->alloc_cb = uv_link_def_alloc_cb;
+  link->read_cb = uv_link_def_read_cb;
+
   return 0;
 }
 
@@ -19,12 +43,11 @@ int uv_link_chain(uv_link_t* from,
   if (from->child != NULL || to->parent != NULL)
     return UV_EINVAL;
 
-  if (from->alloc_cb != NULL || from->read_cb != NULL)
-    return UV_EINVAL;
-
   from->child = to;
   to->parent = from;
 
+  from->saved_alloc_cb = from->alloc_cb;
+  from->saved_read_cb = from->read_cb;
   from->alloc_cb = alloc_cb;
   from->read_cb = read_cb;
 
@@ -39,8 +62,10 @@ int uv_link_unchain(uv_link_t* from, uv_link_t* to) {
   from->child = NULL;
   to->parent = NULL;
 
-  from->alloc_cb = NULL;
-  from->read_cb = NULL;
+  from->alloc_cb = from->saved_alloc_cb;
+  from->read_cb = from->saved_read_cb;
+  from->saved_alloc_cb = NULL;
+  from->saved_read_cb = NULL;
 
   return from->read_stop(from);
 }