diff options
Diffstat (limited to 'src/env.h')
-rw-r--r-- | src/env.h | 59 |
1 files changed, 42 insertions, 17 deletions
@@ -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); |