diff options
author | Fedor Indutny <fedor@indutny.com> | 2016-05-26 01:38:26 -0400 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2016-05-26 01:38:26 -0400 |
commit | 563174a6894f4b4bdf3f90b28fde84d5dd6bfee8 (patch) | |
tree | 02c89b7e3109eaed7fe70d3f45ac958f96281bd8 /src | |
parent | 476e00fb734d0e129edbc6ad1409a87051a3a735 (diff) | |
download | uv_link_t-563174a6894f4b4bdf3f90b28fde84d5dd6bfee8.tar.gz |
uv_link_t: default alloc_cb/read_cb
Diffstat (limited to 'src')
-rw-r--r-- | src/common.h | 12 | ||||
-rw-r--r-- | src/uv_link_observer_t.c | 1 | ||||
-rw-r--r-- | src/uv_link_t.c | 35 |
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); } |