Skip to content

Commit 2b77327

Browse files
addaleaxMylesBorins
authored andcommitted
src: add optional keep-alive object to SetImmediate
Adds the possibility to keep a strong persistent reference to a JS object while a `SetImmediate()` call is in effect. Backport-PR-URL: #18050 Backport-PR-URL: #20456 PR-URL: #17183 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]>
1 parent 9acc7f3 commit 2b77327

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

src/env-inl.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -541,8 +541,15 @@ Environment::scheduled_immediate_count() {
541541
return scheduled_immediate_count_;
542542
}
543543

544-
void Environment::SetImmediate(native_immediate_callback cb, void* data) {
545-
native_immediate_callbacks_.push_back({ cb, data });
544+
void Environment::SetImmediate(native_immediate_callback cb,
545+
void* data,
546+
v8::Local<v8::Object> obj) {
547+
native_immediate_callbacks_.push_back({
548+
cb,
549+
data,
550+
std::unique_ptr<v8::Persistent<v8::Object>>(
551+
obj.IsEmpty() ? nullptr : new v8::Persistent<v8::Object>(isolate_, obj))
552+
});
546553
if (scheduled_immediate_count_[0] == 0)
547554
ActivateImmediateCheck();
548555
scheduled_immediate_count_[0] = scheduled_immediate_count_[0] + 1;

src/env.cc

+2
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ void Environment::RunAndClearNativeImmediates() {
224224
native_immediate_callbacks_.swap(list);
225225
for (const auto& cb : list) {
226226
cb.cb_(this, cb.data_);
227+
if (cb.keep_alive_)
228+
cb.keep_alive_->Reset();
227229
}
228230

229231
#ifdef DEBUG

src/env.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,11 @@ class Environment {
688688
bool EmitNapiWarning();
689689

690690
typedef void (*native_immediate_callback)(Environment* env, void* data);
691-
inline void SetImmediate(native_immediate_callback cb, void* data);
691+
// cb will be called as cb(env, data) on the next event loop iteration.
692+
// obj will be kept alive between now and after the callback has run.
693+
inline void SetImmediate(native_immediate_callback cb,
694+
void* data,
695+
v8::Local<v8::Object> obj = v8::Local<v8::Object>());
692696
// This needs to be available for the JS-land setImmediate().
693697
void ActivateImmediateCheck();
694698

@@ -756,6 +760,7 @@ class Environment {
756760
struct NativeImmediateCallback {
757761
native_immediate_callback cb_;
758762
void* data_;
763+
std::unique_ptr<v8::Persistent<v8::Object>> keep_alive_;
759764
};
760765
std::vector<NativeImmediateCallback> native_immediate_callbacks_;
761766
void RunAndClearNativeImmediates();

0 commit comments

Comments
 (0)