Skip to content

Commit 7306a33

Browse files
committed
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. PR-URL: #17183 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Franziska Hinkelmann <[email protected]> Reviewed-By: Anatoli Papirovski <[email protected]>
1 parent bb44626 commit 7306a33

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

src/env-inl.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,15 @@ Environment::scheduled_immediate_count() {
483483
return scheduled_immediate_count_;
484484
}
485485

486-
void Environment::SetImmediate(native_immediate_callback cb, void* data) {
487-
native_immediate_callbacks_.push_back({ cb, data });
486+
void Environment::SetImmediate(native_immediate_callback cb,
487+
void* data,
488+
v8::Local<v8::Object> obj) {
489+
native_immediate_callbacks_.push_back({
490+
cb,
491+
data,
492+
std::unique_ptr<v8::Persistent<v8::Object>>(
493+
obj.IsEmpty() ? nullptr : new v8::Persistent<v8::Object>(isolate_, obj))
494+
});
488495
if (scheduled_immediate_count_[0] == 0)
489496
ActivateImmediateCheck();
490497
scheduled_immediate_count_[0] = scheduled_immediate_count_[0] + 1;

src/env.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ void Environment::RunAndClearNativeImmediates() {
278278
native_immediate_callbacks_.swap(list);
279279
for (const auto& cb : list) {
280280
cb.cb_(this, cb.data_);
281+
if (cb.keep_alive_)
282+
cb.keep_alive_->Reset();
281283
}
282284

283285
#ifdef DEBUG

src/env.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,11 @@ class Environment {
686686
bool EmitNapiWarning();
687687

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

@@ -751,6 +755,7 @@ class Environment {
751755
struct NativeImmediateCallback {
752756
native_immediate_callback cb_;
753757
void* data_;
758+
std::unique_ptr<v8::Persistent<v8::Object>> keep_alive_;
754759
};
755760
std::vector<NativeImmediateCallback> native_immediate_callbacks_;
756761
void RunAndClearNativeImmediates();

0 commit comments

Comments
 (0)