diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-08-12 02:44:32 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-08-17 18:32:29 +0300 |
commit | d5d7b71521cb9ad72505d66346227688134b8576 (patch) | |
tree | 980ba41623cc3a61073125aa854b806106238f4f /include/libcamera | |
parent | f83820a5d18bfdfa9853ef3ef71abfb47f626ac8 (diff) |
libcamera: object: Add an asynchronous method invocation method
Add a helper invokeMethod() to the Object class that allows asynchrnous
invocation of any method of an Object instance. Asynchronous invocation
occurs when control returns to the event dispatcher of the target
object's thread, in the context of that thread.
To support this, generalise the SignalMessage implementation to support
automatic deletion of the associated BoundMethod, and rename the message
to InvokeMessage to reflect the more generic purpose.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'include/libcamera')
-rw-r--r-- | include/libcamera/object.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/include/libcamera/object.h b/include/libcamera/object.h index e3b39cf5..869200a5 100644 --- a/include/libcamera/object.h +++ b/include/libcamera/object.h @@ -28,6 +28,16 @@ public: void postMessage(std::unique_ptr<Message> msg); + template<typename T, typename... Args, typename std::enable_if<std::is_base_of<Object, T>::value>::type * = nullptr> + void invokeMethod(void (T::*func)(Args...), Args... args) + { + T *obj = static_cast<T *>(this); + BoundMethodBase *method = new BoundMemberMethod<T, Args...>(obj, this, func); + void *pack = new typename BoundMemberMethod<T, Args...>::PackType{ args... }; + + invokeMethod(method, pack); + } + Thread *thread() const { return thread_; } void moveToThread(Thread *thread); @@ -40,6 +50,8 @@ private: friend class BoundMethodBase; friend class Thread; + void invokeMethod(BoundMethodBase *method, void *pack); + void connect(SignalBase *signal); void disconnect(SignalBase *signal); |