summaryrefslogtreecommitdiff
path: root/src/env.cc
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2017-11-18 14:24:04 +0100
committerAnna Henningsen <anna@addaleax.net>2017-11-21 12:50:04 +0100
commit85f3e319c40dfe5b89d1f31a69ac8f3d9cf291b2 (patch)
tree513bbca1c1165f8d52bef9ef57cbfbf391781b11 /src/env.cc
parent69e6c5a212622ec15b8c2cf904480b6582c6c3a5 (diff)
downloadandroid-node-v8-85f3e319c40dfe5b89d1f31a69ac8f3d9cf291b2.tar.gz
android-node-v8-85f3e319c40dfe5b89d1f31a69ac8f3d9cf291b2.tar.bz2
android-node-v8-85f3e319c40dfe5b89d1f31a69ac8f3d9cf291b2.zip
src: introduce internal C++ SetImmediate() mechanism
PR-URL: https://github.com/nodejs/node/pull/17117 Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/env.cc')
-rw-r--r--src/env.cc53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/env.cc b/src/env.cc
index 425333ed7a..df9f872705 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -277,6 +277,59 @@ void Environment::EnvPromiseHook(v8::PromiseHookType type,
}
}
+void Environment::RunAndClearNativeImmediates() {
+ size_t count = native_immediate_callbacks_.size();
+ if (count > 0) {
+ std::vector<NativeImmediateCallback> list;
+ native_immediate_callbacks_.swap(list);
+ for (const auto& cb : list) {
+ cb.cb_(this, cb.data_);
+ }
+
+#ifdef DEBUG
+ CHECK_GE(scheduled_immediate_count_[0], count);
+#endif
+ scheduled_immediate_count_[0] = scheduled_immediate_count_[0] - count;
+ }
+}
+
+static bool MaybeStopImmediate(Environment* env) {
+ if (env->scheduled_immediate_count()[0] == 0) {
+ uv_check_stop(env->immediate_check_handle());
+ uv_idle_stop(env->immediate_idle_handle());
+ return true;
+ }
+ return false;
+}
+
+
+void Environment::CheckImmediate(uv_check_t* handle) {
+ Environment* env = Environment::from_immediate_check_handle(handle);
+ HandleScope scope(env->isolate());
+ Context::Scope context_scope(env->context());
+
+ if (MaybeStopImmediate(env))
+ return;
+
+ env->RunAndClearNativeImmediates();
+
+ MakeCallback(env->isolate(),
+ env->process_object(),
+ env->immediate_callback_string(),
+ 0,
+ nullptr,
+ {0, 0}).ToLocalChecked();
+
+ MaybeStopImmediate(env);
+}
+
+void Environment::ActivateImmediateCheck() {
+ uv_check_start(&immediate_check_handle_, CheckImmediate);
+ // Idle handle is needed only to stop the event loop from blocking in poll.
+ uv_idle_start(&immediate_idle_handle_, [](uv_idle_t*){ });
+}
+
+
void CollectExceptionInfo(Environment* env,
v8::Local<v8::Object> obj,
int errorno,