Skip to content

Commit 7e68080

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 PR-URL: #17183 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]>
1 parent 83c725d commit 7e68080

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
@@ -506,8 +506,15 @@ Environment::scheduled_immediate_count() {
506506
return scheduled_immediate_count_;
507507
}
508508

509-
void Environment::SetImmediate(native_immediate_callback cb, void* data) {
510-
native_immediate_callbacks_.push_back({ cb, data });
509+
void Environment::SetImmediate(native_immediate_callback cb,
510+
void* data,
511+
v8::Local<v8::Object> obj) {
512+
native_immediate_callbacks_.push_back({
513+
cb,
514+
data,
515+
std::unique_ptr<v8::Persistent<v8::Object>>(
516+
obj.IsEmpty() ? nullptr : new v8::Persistent<v8::Object>(isolate_, obj))
517+
});
511518
if (scheduled_immediate_count_[0] == 0)
512519
ActivateImmediateCheck();
513520
scheduled_immediate_count_[0] = scheduled_immediate_count_[0] + 1;

src/env.cc

+2
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ void Environment::RunAndClearNativeImmediates() {
276276
native_immediate_callbacks_.swap(list);
277277
for (const auto& cb : list) {
278278
cb.cb_(this, cb.data_);
279+
if (cb.keep_alive_)
280+
cb.keep_alive_->Reset();
279281
}
280282

281283
#ifdef DEBUG

src/env.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,11 @@ class Environment {
661661
bool EmitNapiWarning();
662662

663663
typedef void (*native_immediate_callback)(Environment* env, void* data);
664-
inline void SetImmediate(native_immediate_callback cb, void* data);
664+
// cb will be called as cb(env, data) on the next event loop iteration.
665+
// obj will be kept alive between now and after the callback has run.
666+
inline void SetImmediate(native_immediate_callback cb,
667+
void* data,
668+
v8::Local<v8::Object> obj = v8::Local<v8::Object>());
665669
// This needs to be available for the JS-land setImmediate().
666670
void ActivateImmediateCheck();
667671

@@ -741,6 +745,7 @@ class Environment {
741745
struct NativeImmediateCallback {
742746
native_immediate_callback cb_;
743747
void* data_;
748+
std::unique_ptr<v8::Persistent<v8::Object>> keep_alive_;
744749
};
745750
std::vector<NativeImmediateCallback> native_immediate_callbacks_;
746751
void RunAndClearNativeImmediates();

0 commit comments

Comments
 (0)