diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-07-15 22:17:45 +0200 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2019-08-01 00:51:43 +0200 |
commit | 5207dec0175de92116262e8382d6ac57def3a203 (patch) | |
tree | e90e855f7a8a228e00fe0d49fb311b319de74c3d /src/env.h | |
parent | 61f3a5c60ad78506e9e0caae061a04ccab878ca1 (diff) | |
download | android-node-v8-5207dec0175de92116262e8382d6ac57def3a203.tar.gz android-node-v8-5207dec0175de92116262e8382d6ac57def3a203.tar.bz2 android-node-v8-5207dec0175de92116262e8382d6ac57def3a203.zip |
src: allow generic C++ callables in SetImmediate()
Modify the native `SetImmediate()` functions to take generic C++
callables as arguments. This makes passing arguments to the callback
easier, and in particular, it allows passing `std::unique_ptr`s
directly, which in turn makes sure that the data they point to is
deleted if the `Environment` is torn down before the callback can run.
PR-URL: https://github.com/nodejs/node/pull/28704
Reviewed-By: James M Snell <jasnell@gmail.com>
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); |