From a3c0ce55c90d6921aca55f2316ea98b06bbb951d Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Mon, 18 May 2020 18:53:43 +0200 Subject: [PATCH] Support calling methods from timers We can't safely use the normal timers in base classes as we cannot guarantee that subclasses will call the base class' handleTimeout() properly if the subclass overrides it. --- common/rfb/Timer.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common/rfb/Timer.h b/common/rfb/Timer.h index ef50972..ddfce1b 100644 --- a/common/rfb/Timer.h +++ b/common/rfb/Timer.h @@ -35,6 +35,8 @@ namespace rfb { dispatch elapsed Timer callbacks and to determine how long to wait in select() for the next timeout to occur. + For classes that can be derived it's best to use MethodTimer which can call a specific + method on the class, thus avoiding conflicts when subclassing. */ struct Timer { @@ -101,6 +103,19 @@ namespace rfb { static std::list pending; }; + template class MethodTimer + : public Timer, public Timer::Callback { + public: + MethodTimer(T* obj_, bool (T::*cb_)(Timer*)) + : Timer(this), obj(obj_), cb(cb_) {} + + virtual bool handleTimeout(Timer* t) { return (obj->*cb)(t); } + + private: + T* obj; + bool (T::*cb)(Timer*); + }; + }; #endif