summaryrefslogtreecommitdiff
path: root/src/env.h
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2019-07-15 22:17:45 +0200
committerAnna Henningsen <anna@addaleax.net>2019-08-01 00:51:43 +0200
commit5207dec0175de92116262e8382d6ac57def3a203 (patch)
treee90e855f7a8a228e00fe0d49fb311b319de74c3d /src/env.h
parent61f3a5c60ad78506e9e0caae061a04ccab878ca1 (diff)
downloadandroid-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.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);