diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-11-18 14:24:04 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-11-21 12:50:04 +0100 |
commit | 85f3e319c40dfe5b89d1f31a69ac8f3d9cf291b2 (patch) | |
tree | 513bbca1c1165f8d52bef9ef57cbfbf391781b11 /src/env.cc | |
parent | 69e6c5a212622ec15b8c2cf904480b6582c6c3a5 (diff) | |
download | android-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.cc | 53 |
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, |