From c37772284a2531096fd0971827175f79e90ec0ca Mon Sep 17 00:00:00 2001 From: John Haley Date: Mon, 20 Apr 2015 13:03:02 -0700 Subject: [PATCH 1/2] This fixes polling sync promises in callbacks. This also fixes #497. --- generate/templates/partials/callback_helpers.cc | 11 ++++++++--- generate/templates/partials/field_accessors.cc | 10 +++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/generate/templates/partials/callback_helpers.cc b/generate/templates/partials/callback_helpers.cc index f5bc67f71..8c1d34651 100644 --- a/generate/templates/partials/callback_helpers.cc +++ b/generate/templates/partials/callback_helpers.cc @@ -80,6 +80,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_as NanAssignPersistent(baton->promise, promise); + uv_close((uv_handle_t*) &baton->req, NULL); uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling); uv_async_send(&baton->req); return; @@ -110,7 +111,9 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_async(uv_as baton->result = {{ cbFunction.return.noResults }}; } {% endeach %} + baton->done = true; + uv_close((uv_handle_t*) &baton->req, NULL); } void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromisePolling(uv_async_t* req, int status) { @@ -120,7 +123,7 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromis Local promise = NanNew(baton->promise); NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As()); Local argv[1]; // MSBUILD won't assign an array of length 0 - Local isPending = isPendingFn->Call(0, argv)->ToBoolean(); + Local isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean(); if (isPending->Value()) { uv_async_send(&baton->req); @@ -128,11 +131,11 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromis } NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As()); - Local isFulfilled = isFulfilledFn->Call(0, argv)->ToBoolean(); + Local isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean(); if (isFulfilled->Value()) { NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As()); - Handle result = resultFn->Call(0, argv); + Handle result = resultFn->Call(promise, 0, argv); {% each cbFunction|returnsInfo false true as _return %} if (result.IsEmpty() || result->IsNativeError()) { @@ -165,6 +168,8 @@ void {{ cppClassName }}::{{ cppFunctionName }}_{{ cbFunction.name }}_asyncPromis baton->result = {{ cbFunction.return.error }}; baton->done = false; } + + uv_close((uv_handle_t*) &baton->req, NULL); } {%endif%} {%endeach%} diff --git a/generate/templates/partials/field_accessors.cc b/generate/templates/partials/field_accessors.cc index f5f3aa448..03131d6ba 100644 --- a/generate/templates/partials/field_accessors.cc +++ b/generate/templates/partials/field_accessors.cc @@ -173,6 +173,7 @@ NanAssignPersistent(baton->promise, promise); + uv_close((uv_handle_t*) &baton->req, NULL); uv_async_init(uv_default_loop(), &baton->req, (uv_async_cb) {{ field.name }}_asyncPromisePolling); uv_async_send(&baton->req); return; @@ -204,6 +205,7 @@ } {% endeach %} baton->done = true; + uv_close((uv_handle_t*) &baton->req, NULL); } void {{ cppClassName }}::{{ field.name }}_asyncPromisePolling(uv_async_t* req, int status) { @@ -213,7 +215,7 @@ Local promise = NanNew(baton->promise); NanCallback* isPendingFn = new NanCallback(promise->Get(NanNew("isPending")).As()); Local argv[1]; // MSBUILD won't assign an array of length 0 - Local isPending = isPendingFn->Call(0, argv)->ToBoolean(); + Local isPending = isPendingFn->Call(promise, 0, argv)->ToBoolean(); if (isPending->Value()) { uv_async_send(&baton->req); @@ -221,11 +223,11 @@ } NanCallback* isFulfilledFn = new NanCallback(promise->Get(NanNew("isFulfilled")).As()); - Local isFulfilled = isFulfilledFn->Call(0, argv)->ToBoolean(); + Local isFulfilled = isFulfilledFn->Call(promise, 0, argv)->ToBoolean(); if (isFulfilled->Value()) { NanCallback* resultFn = new NanCallback(promise->Get(NanNew("value")).As()); - Handle result = resultFn->Call(0, argv); + Handle result = resultFn->Call(promise, 0, argv); {% each field|returnsInfo false true as _return %} if (result.IsEmpty() || result->IsNativeError()) { @@ -258,6 +260,8 @@ baton->result = {{ field.return.error }}; baton->done = false; } + + uv_close((uv_handle_t*) &baton->req, NULL); } {% endif %} {% endif %} From 96b39b0c1a2abe888ed3036418d64e256edf1266 Mon Sep 17 00:00:00 2001 From: Tim Date: Mon, 20 Apr 2015 17:02:03 -0400 Subject: [PATCH 2/2] Removed process.exit to prove the process will quit --- test/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.js b/test/index.js index bde4d989c..c78082e31 100644 --- a/test/index.js +++ b/test/index.js @@ -15,4 +15,4 @@ var args = cov.concat([ "--expose-gc" ]); -fork(bin, args, { cwd: path.join(__dirname, "../") }).on("close", process.exit); +fork(bin, args, { cwd: path.join(__dirname, "../") });