summaryrefslogtreecommitdiff
path: root/src/env.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-06-06 13:22:48 -0600
committerAnna Henningsen <anna@addaleax.net>2017-06-10 11:38:02 +0200
commitcc2dd93ea5ca097c105b10039b110409dcf9cecd (patch)
tree76352f5814f8e3c9aaeb80336642f6a868613046 /src/env.cc
parentb9379095e165cd6c04c8e847654387a287eedc98 (diff)
downloadandroid-node-v8-cc2dd93ea5ca097c105b10039b110409dcf9cecd.tar.gz
android-node-v8-cc2dd93ea5ca097c105b10039b110409dcf9cecd.tar.bz2
android-node-v8-cc2dd93ea5ca097c105b10039b110409dcf9cecd.zip
async_wrap: expose enable/disablePromiseHook API
Allow node::PromiseHook (src/async-wrap.cc) to be enabled/disabled from the JavaScript API. PR-URL: https://github.com/nodejs/node/pull/13509 Reviewed-By: Andreas Madsen <amwebdk@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'src/env.cc')
-rw-r--r--src/env.cc25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/env.cc b/src/env.cc
index 0bf4b573aa..c97868a588 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -11,6 +11,7 @@
#endif
#include <stdio.h>
+#include <algorithm>
namespace node {
@@ -178,12 +179,36 @@ void Environment::AtExit(void (*cb)(void* arg), void* arg) {
}
void Environment::AddPromiseHook(promise_hook_func fn, void* arg) {
+ auto it = std::find_if(
+ promise_hooks_.begin(), promise_hooks_.end(),
+ [&](const PromiseHookCallback& hook) {
+ return hook.cb_ == fn && hook.arg_ == arg;
+ });
+ CHECK_EQ(it, promise_hooks_.end());
promise_hooks_.push_back(PromiseHookCallback{fn, arg});
+
if (promise_hooks_.size() == 1) {
isolate_->SetPromiseHook(EnvPromiseHook);
}
}
+bool Environment::RemovePromiseHook(promise_hook_func fn, void* arg) {
+ auto it = std::find_if(
+ promise_hooks_.begin(), promise_hooks_.end(),
+ [&](const PromiseHookCallback& hook) {
+ return hook.cb_ == fn && hook.arg_ == arg;
+ });
+
+ if (it == promise_hooks_.end()) return false;
+
+ promise_hooks_.erase(it);
+ if (promise_hooks_.empty()) {
+ isolate_->SetPromiseHook(nullptr);
+ }
+
+ return true;
+}
+
void Environment::EnvPromiseHook(v8::PromiseHookType type,
v8::Local<v8::Promise> promise,
v8::Local<v8::Value> parent) {