summaryrefslogtreecommitdiff
path: root/src/handle_wrap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/handle_wrap.cc')
-rw-r--r--src/handle_wrap.cc30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/handle_wrap.cc b/src/handle_wrap.cc
index 6e07643893..5b6594a3a9 100644
--- a/src/handle_wrap.cc
+++ b/src/handle_wrap.cc
@@ -64,8 +64,10 @@ Handle<Value> HandleWrap::Unref(const Arguments& args) {
UNWRAP
- // Calling this function twice should never happen.
- assert(wrap->unref == false);
+ // Calling unnecessarily is a no-op
+ if (wrap->unref) {
+ return v8::Undefined();
+ }
wrap->unref = true;
uv_unref(uv_default_loop());
@@ -74,6 +76,24 @@ Handle<Value> HandleWrap::Unref(const Arguments& args) {
}
+// Adds a reference to keep uv alive because of this thing.
+Handle<Value> HandleWrap::Ref(const Arguments& args) {
+ HandleScope scope;
+
+ UNWRAP
+
+ // Calling multiple times is a no-op
+ if (!wrap->unref) {
+ return v8::Undefined();
+ }
+
+ wrap->unref = false;
+ uv_ref(uv_default_loop());
+
+ return v8::Undefined();
+}
+
+
Handle<Value> HandleWrap::Close(const Arguments& args) {
HandleScope scope;
@@ -82,10 +102,8 @@ Handle<Value> HandleWrap::Close(const Arguments& args) {
assert(!wrap->object_.IsEmpty());
uv_close(wrap->handle__, OnClose);
- if (wrap->unref) {
- uv_ref(uv_default_loop());
- wrap->unref = false;
- }
+
+ HandleWrap::Ref(args);
wrap->StateChange();