about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFedor Indutny <fedor@indutny.com>2016-05-27 09:59:45 -0400
committerFedor Indutny <fedor@indutny.com>2016-05-27 09:59:45 -0400
commit800432e83ea2bc09079b9487a565d41bf36f872c (patch)
tree1572a58a6958585b5473a50de1ad714a807c8880
parentaa6a92fdd3c3e22fee12c4cc9a657034dd5ce184 (diff)
downloaduv_link_t-800432e83ea2bc09079b9487a565d41bf36f872c.tar.gz
include: add `arg` to write/shutdown
-rw-r--r--README.md7
-rw-r--r--include/uv_link_t.h22
-rw-r--r--src/uv_link_observer_t.c11
-rw-r--r--src/uv_link_source_t.c14
-rw-r--r--test/src/test-uv-link-source-t.c6
5 files changed, 40 insertions, 20 deletions
diff --git a/README.md b/README.md
index 14f6963..634281d 100644
--- a/README.md
+++ b/README.md
@@ -64,9 +64,12 @@ Now comes a funny part, any of these method implementations may hook up into
 the parent link in a chain to perform their actions:
 
 ```c
-static int shutdown_impl(uv_link_t* link, uv_link_shutdown_cb cb) {
+static int shutdown_impl(uv_link_t* link,
+                         uv_link_t* source,
+                         uv_link_shutdown_cb cb,
+                         void* arg) {
   fprintf(stderr, "this will be printed\n");
-  return uv_link_shutdown(link->parent, cb);
+  return uv_link_shutdown(link->parent, cb, arg);
 }
 ```
 
diff --git a/include/uv_link_t.h b/include/uv_link_t.h
index 63e2410..2adaac3 100644
--- a/include/uv_link_t.h
+++ b/include/uv_link_t.h
@@ -14,8 +14,8 @@ typedef void (*uv_link_alloc_cb)(uv_link_t* link,
 typedef void (*uv_link_read_cb)(uv_link_t* link,
                                 ssize_t nread,
                                 const uv_buf_t* buf);
-typedef void (*uv_link_write_cb)(uv_link_t* source, int status);
-typedef void (*uv_link_shutdown_cb)(uv_link_t* source, int status);
+typedef void (*uv_link_write_cb)(uv_link_t* source, int status, void* arg);
+typedef void (*uv_link_shutdown_cb)(uv_link_t* source, int status, void* arg);
 
 struct uv_link_methods_s {
   int (*read_start)(uv_link_t* link);
@@ -26,12 +26,16 @@ struct uv_link_methods_s {
                const uv_buf_t bufs[],
                unsigned int nbufs,
                uv_stream_t* send_handle,
-               uv_link_write_cb cb);
+               uv_link_write_cb cb,
+               void* arg);
   int (*try_write)(uv_link_t* link,
                    const uv_buf_t bufs[],
                    unsigned int nbufs);
 
-  int (*shutdown)(uv_link_t* link, uv_link_t* source, uv_link_shutdown_cb cb);
+  int (*shutdown)(uv_link_t* link,
+                  uv_link_t* source,
+                  uv_link_shutdown_cb cb,
+                  void* arg);
 
   /* Overriding callbacks */
   uv_link_alloc_cb alloc_cb_override;
@@ -86,8 +90,9 @@ static int uv_link_write(uv_link_t* link,
                          const uv_buf_t bufs[],
                          unsigned int nbufs,
                          uv_stream_t* send_handle,
-                         uv_link_write_cb cb) {
-  return link->methods->write(link, source, bufs, nbufs, send_handle, cb);
+                         uv_link_write_cb cb,
+                         void* arg) {
+  return link->methods->write(link, source, bufs, nbufs, send_handle, cb, arg);
 }
 
 
@@ -99,8 +104,9 @@ static int uv_link_try_write(uv_link_t* link,
 
 static int uv_link_shutdown(uv_link_t* link,
                             uv_link_t* source,
-                            uv_link_shutdown_cb cb) {
-  return link->methods->shutdown(link, source, cb);
+                            uv_link_shutdown_cb cb,
+                            void* arg) {
+  return link->methods->shutdown(link, source, cb, arg);
 }
 
 /* Link Source */
diff --git a/src/uv_link_observer_t.c b/src/uv_link_observer_t.c
index 07f3dca..4e50010 100644
--- a/src/uv_link_observer_t.c
+++ b/src/uv_link_observer_t.c
@@ -27,12 +27,14 @@ static int uv_link_observer_write(uv_link_t* link,
                                   const uv_buf_t bufs[],
                                   unsigned int nbufs,
                                   uv_stream_t* send_handle,
-                                  uv_link_write_cb cb) {
+                                  uv_link_write_cb cb,
+                                  void* arg) {
   uv_link_observer_t* observer;
 
   observer = container_of(link, uv_link_observer_t, link);
 
-  return uv_link_write(observer->target, source, bufs, nbufs, send_handle, cb);
+  return uv_link_write(observer->target, source, bufs, nbufs, send_handle, cb,
+                       arg);
 }
 
 
@@ -49,12 +51,13 @@ static int uv_link_observer_try_write(uv_link_t* link,
 
 static int uv_link_observer_shutdown(uv_link_t* link,
                                      uv_link_t* source,
-                                     uv_link_shutdown_cb cb) {
+                                     uv_link_shutdown_cb cb,
+                                     void* arg) {
   uv_link_observer_t* observer;
 
   observer = container_of(link, uv_link_observer_t, link);
 
-  return uv_link_shutdown(observer->target, source, cb);
+  return uv_link_shutdown(observer->target, source, cb, arg);
 }
 
 
diff --git a/src/uv_link_source_t.c b/src/uv_link_source_t.c
index d3d4c3f..c445fab 100644
--- a/src/uv_link_source_t.c
+++ b/src/uv_link_source_t.c
@@ -9,12 +9,14 @@ typedef struct uv_link_source_shutdown_s uv_link_source_shutdown_t;
 struct uv_link_source_write_s {
   uv_write_t req;
   uv_link_t* link;
+  void* arg;
   uv_link_write_cb write_cb;
 };
 
 struct uv_link_source_shutdown_s {
   uv_shutdown_t req;
   uv_link_t* link;
+  void* arg;
   uv_link_shutdown_cb shutdown_cb;
 };
 
@@ -65,7 +67,7 @@ static void uv_link_source_wrap_write_cb(uv_write_t* req, int status) {
   uv_link_source_write_t* lreq;
 
   lreq = container_of(req, uv_link_source_write_t, req);
-  lreq->write_cb(lreq->link, status);
+  lreq->write_cb(lreq->link, status, lreq->arg);
   free(lreq);
 }
 
@@ -75,7 +77,8 @@ static int uv_link_source_write(uv_link_t* link,
                                 const uv_buf_t bufs[],
                                 unsigned int nbufs,
                                 uv_stream_t* send_handle,
-                                uv_link_write_cb cb) {
+                                uv_link_write_cb cb,
+                                void* arg) {
   uv_link_source_t* s;
   uv_link_source_write_t* req;
 
@@ -86,6 +89,7 @@ static int uv_link_source_write(uv_link_t* link,
 
   req->link = source;
   req->write_cb = cb;
+  req->arg = arg;
 
   return uv_write2(&req->req, s->stream, bufs, nbufs, send_handle,
                    uv_link_source_wrap_write_cb);
@@ -107,14 +111,15 @@ static void uv_link_source_wrap_shutdown_cb(uv_shutdown_t* req, int status) {
   uv_link_source_shutdown_t* lreq;
 
   lreq = container_of(req, uv_link_source_shutdown_t, req);
-  lreq->shutdown_cb(lreq->link, status);
+  lreq->shutdown_cb(lreq->link, status, lreq->arg);
   free(lreq);
 }
 
 
 static int uv_link_source_shutdown(uv_link_t* link,
                                    uv_link_t* source,
-                                   uv_link_shutdown_cb cb) {
+                                   uv_link_shutdown_cb cb,
+                                   void* arg) {
   uv_link_source_t* s;
   uv_link_source_shutdown_t* req;
 
@@ -126,6 +131,7 @@ static int uv_link_source_shutdown(uv_link_t* link,
 
   req->link = source;
   req->shutdown_cb = cb;
+  req->arg = arg;
 
   return uv_shutdown(&req->req, s->stream, uv_link_source_wrap_shutdown_cb);
 }
diff --git a/test/src/test-uv-link-source-t.c b/test/src/test-uv-link-source-t.c
index 31a0c40..99d97d7 100644
--- a/test/src/test-uv-link-source-t.c
+++ b/test/src/test-uv-link-source-t.c
@@ -7,6 +7,7 @@ static int fds[2];
 static uv_loop_t* loop;
 static uv_pipe_t pair_right;
 static uv_link_source_t source;
+static int test_arg;
 
 static int write_cb_called;
 static int alloc_cb_called;
@@ -24,8 +25,9 @@ static void read_one() {
   CHECK_EQ(buf[0], 'x', "data should match");
 }
 
-static void source_write_cb(uv_link_t* link, int status) {
+static void source_write_cb(uv_link_t* link, int status, void* arg) {
   CHECK_EQ(link, &source.link, "link == &source.link");
+  CHECK_EQ(arg, &test_arg, "arg == &test_arg");
 
   write_cb_called++;
 
@@ -39,7 +41,7 @@ static void test_writes() {
   /* .write() should work */
   buf = uv_buf_init("x", 1);
   CHECK_EQ(uv_link_write(&source.link, &source.link, &buf, 1, NULL,
-                         source_write_cb),
+                         source_write_cb, &test_arg),
            0,
            "source.link.write() should return 0");