summaryrefslogtreecommitdiff
path: root/src/env.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/env.h')
-rw-r--r--src/env.h59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/env.h b/src/env.h
index 5ffefde5ce..855c02aeca 100644
--- a/src/env.h
+++ b/src/env.h
@@ -1175,15 +1175,15 @@ class Environment : public MemoryRetainer {
return current_value;
}
- typedef void (*native_immediate_callback)(Environment* env, void* data);
- // cb will be called as cb(env, data) on the next event loop iteration.
- // obj will be kept alive between now and after the callback has run.
- inline void SetImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj = v8::Local<v8::Object>());
- inline void SetUnrefImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj =
+ // cb will be called as cb(env) on the next event loop iteration.
+ // keep_alive will be kept alive between now and after the callback has run.
+ template <typename Fn>
+ inline void SetImmediate(Fn&& cb,
+ v8::Local<v8::Object> keep_alive =
+ v8::Local<v8::Object>());
+ template <typename Fn>
+ inline void SetUnrefImmediate(Fn&& cb,
+ v8::Local<v8::Object> keep_alive =
v8::Local<v8::Object>());
// This needs to be available for the JS-land setImmediate().
void ToggleImmediateRef(bool ref);
@@ -1248,9 +1248,9 @@ class Environment : public MemoryRetainer {
#endif // HAVE_INSPECTOR
private:
- inline void CreateImmediate(native_immediate_callback cb,
- void* data,
- v8::Local<v8::Object> obj,
+ template <typename Fn>
+ inline void CreateImmediate(Fn&& cb,
+ v8::Local<v8::Object> keep_alive,
bool ref);
inline void ThrowError(v8::Local<v8::Value> (*fun)(v8::Local<v8::String>),
@@ -1374,13 +1374,38 @@ class Environment : public MemoryRetainer {
std::list<ExitCallback> at_exit_functions_;
- struct NativeImmediateCallback {
- native_immediate_callback cb_;
- void* data_;
- v8::Global<v8::Object> keep_alive_;
+ class NativeImmediateCallback {
+ public:
+ explicit inline NativeImmediateCallback(bool refed);
+
+ virtual ~NativeImmediateCallback() = default;
+ virtual void Call(Environment* env) = 0;
+
+ inline bool is_refed() const;
+ inline std::unique_ptr<NativeImmediateCallback> get_next();
+ inline void set_next(std::unique_ptr<NativeImmediateCallback> next);
+
+ private:
bool refed_;
+ std::unique_ptr<NativeImmediateCallback> next_;
+ };
+
+ template <typename Fn>
+ class NativeImmediateCallbackImpl final : public NativeImmediateCallback {
+ public:
+ NativeImmediateCallbackImpl(Fn&& callback,
+ v8::Global<v8::Object>&& keep_alive,
+ bool refed);
+ void Call(Environment* env) override;
+
+ private:
+ Fn callback_;
+ v8::Global<v8::Object> keep_alive_;
};
- std::vector<NativeImmediateCallback> native_immediate_callbacks_;
+
+ std::unique_ptr<NativeImmediateCallback> native_immediate_callbacks_head_;
+ NativeImmediateCallback* native_immediate_callbacks_tail_ = nullptr;
+
void RunAndClearNativeImmediates();
static void CheckImmediate(uv_check_t* handle);