From 54e95960fa0e12eff19aa9997e3a729d22e2caa7 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Sat, 21 Sep 2019 17:07:31 +0200 Subject: [PATCH] quic: remove opaque pointer from Timer callback Use the more C++-y `std::function` approach which renders opaque pointers unnecessary. PR-URL: https://github.com/nodejs/quic/pull/126 Reviewed-By: Daniel Bevenius Reviewed-By: James M Snell --- src/node_quic_session-inl.h | 10 ---------- src/node_quic_session.cc | 4 ++-- src/node_quic_session.h | 3 --- src/node_quic_util.cc | 2 +- src/node_quic_util.h | 21 ++++++--------------- 5 files changed, 9 insertions(+), 31 deletions(-) diff --git a/src/node_quic_session-inl.h b/src/node_quic_session-inl.h index 858b56522a..bdd0d81f23 100644 --- a/src/node_quic_session-inl.h +++ b/src/node_quic_session-inl.h @@ -652,16 +652,6 @@ inline int Empty(const ngtcp2_vec* vec, size_t cnt) { return i == cnt; } -inline void QuicSession::OnIdleTimeoutCB(void* data) { - QuicSession* session = static_cast(data); - session->OnIdleTimeout(); -} - -inline void QuicSession::OnRetransmitTimeoutCB(void* data) { - QuicSession* session = static_cast(data); - session->MaybeTimeout(); -} - } // namespace quic } // namespace node diff --git a/src/node_quic_session.cc b/src/node_quic_session.cc index 4830678cc3..ed7f45ea7e 100644 --- a/src/node_quic_session.cc +++ b/src/node_quic_session.cc @@ -64,8 +64,8 @@ QuicSession::QuicSession( alpn_(alpn), options_(options), initial_connection_close_(initial_connection_close), - idle_(new Timer(socket->env(), OnIdleTimeoutCB, this)), - retransmit_(new Timer(socket->env(), OnRetransmitTimeoutCB, this)), + idle_(new Timer(socket->env(), [this]() { OnIdleTimeout(); })), + retransmit_(new Timer(socket->env(), [this]() { MaybeTimeout(); })), state_(env()->isolate(), IDX_QUIC_SESSION_STATE_COUNT), allocator_(this), crypto_rx_ack_( diff --git a/src/node_quic_session.h b/src/node_quic_session.h index fede3d21bb..18dbcdd316 100644 --- a/src/node_quic_session.h +++ b/src/node_quic_session.h @@ -736,9 +736,6 @@ class QuicSession : public AsyncWrap, const ngtcp2_pkt_stateless_reset* sr, void* user_data); - static inline void OnIdleTimeoutCB(void* data); - static inline void OnRetransmitTimeoutCB(void* data); - void UpdateIdleTimer(); void UpdateRetransmitTimer(uint64_t timeout); void StopRetransmitTimer(); diff --git a/src/node_quic_util.cc b/src/node_quic_util.cc index 7823f5bdc1..1a028d5931 100644 --- a/src/node_quic_util.cc +++ b/src/node_quic_util.cc @@ -19,7 +19,7 @@ void Timer::Free(Timer* timer) { void Timer::OnTimeout(uv_timer_t* timer) { Timer* t = ContainerOf(&Timer::timer_, timer); - t->OnTimeout(); + t->fn_(); } void Timer::CleanupHook(void* data) { diff --git a/src/node_quic_util.h b/src/node_quic_util.h index b0c0957fed..542bdcf5f4 100644 --- a/src/node_quic_util.h +++ b/src/node_quic_util.h @@ -393,14 +393,10 @@ void IncrementStat( // reset the timer; Stop to halt the timer. class Timer { public: - inline explicit Timer( - Environment* env, - std::function fn, - void* data = nullptr) : - stopped_(false), + explicit Timer(Environment* env, std::function fn) + : stopped_(false), env_(env), - fn_(fn), - data_(data) { + fn_(fn) { uv_timer_init(env_->event_loop(), &timer_); timer_.data = this; env->AddCleanupHook(CleanupHook, this); @@ -412,7 +408,7 @@ class Timer { // Stops the timer with the side effect of the timer no longer being usable. // It will be cleaned up and the Timer object will be destroyed. - inline void Stop() { + void Stop() { if (stopped_) return; stopped_ = true; @@ -425,7 +421,7 @@ class Timer { // If the timer is not currently active, interval must be either 0 or greater. // If the timer is already active, interval is ignored. - inline void Update(uint64_t interval) { + void Update(uint64_t interval) { if (stopped_) return; uv_timer_start(&timer_, OnTimeout, interval, interval); @@ -435,18 +431,13 @@ class Timer { static void Free(Timer* timer); private: - inline void OnTimeout() { - fn_(data_); - } - static void OnTimeout(uv_timer_t* timer); static void CleanupHook(void* data); bool stopped_; Environment* env_; - std::function fn_; + std::function fn_; uv_timer_t timer_; - void* data_; }; using TimerPointer = DeleteFnPtr;