about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/uv_link_source_t.c19
-rw-r--r--src/uv_link_t.c3
2 files changed, 16 insertions, 6 deletions
diff --git a/src/uv_link_source_t.c b/src/uv_link_source_t.c
index 96fc937..7907d65 100644
--- a/src/uv_link_source_t.c
+++ b/src/uv_link_source_t.c
@@ -143,7 +143,11 @@ static void uv_link_source_close_cb(uv_handle_t* handle) {
   source = handle->data;
 
   source->stream = NULL;
-  source->close_cb(source->close_source);
+  if (source->close_cb) {
+      source->close_cb(source->close_source);
+  }
+  source->close_cb = NULL;
+  source->close_source = NULL;
 }
 
 
@@ -153,10 +157,15 @@ static void uv_link_source_close(uv_link_t* link, uv_link_t* source,
 
   s = (uv_link_source_t*) link;
 
-  s->close_cb = cb;
-  s->close_source = source;
-
-  uv_close((uv_handle_t*) s->stream, uv_link_source_close_cb);
+  if (s->stream) {
+      if (!uv_is_closing((const uv_handle_t *) s->stream)) {
+          s->close_cb = cb;
+          s->close_source = source;
+          uv_close((uv_handle_t *) s->stream, uv_link_source_close_cb);
+      }
+  } else {
+      cb(source);
+  }
 }
 
 
diff --git a/src/uv_link_t.c b/src/uv_link_t.c
index 32c676e..78ada82 100644
--- a/src/uv_link_t.c
+++ b/src/uv_link_t.c
@@ -101,7 +101,8 @@ int uv_link_read_start(uv_link_t* link) {
 int uv_link_read_stop(uv_link_t* link) {
   if (link == NULL)
     return uv_link_error(link, UV_EFAULT);
-  CLOSE_WRAP(link->methods->read_stop(link));
+  if (NULL != link->methods->read_stop)
+    CLOSE_WRAP(link->methods->read_stop(link));
 }