diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-08-12 00:06:48 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2019-08-17 18:32:30 +0300 |
commit | 5a954cb8b57ec1869958985f6557c38bb5503e5a (patch) | |
tree | e21d6b22f823f46b6e0544236697f7ca7eaf75a4 | |
parent | d5d7b71521cb9ad72505d66346227688134b8576 (diff) |
libcamera: object: Notify objects of thread move
Send a synchronous message to objects just before they get moved to a
new thread. This allows the object to perform any required processing.
EventNotifier and Timer objects will use this mechanism to move
themselves to the new thread's event disaptcher.
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>
-rw-r--r-- | include/libcamera/object.h | 2 | ||||
-rw-r--r-- | src/libcamera/include/message.h | 1 | ||||
-rw-r--r-- | src/libcamera/message.cpp | 2 | ||||
-rw-r--r-- | src/libcamera/object.cpp | 12 |
4 files changed, 17 insertions, 0 deletions
diff --git a/include/libcamera/object.h b/include/libcamera/object.h index 869200a5..e128c75e 100644 --- a/include/libcamera/object.h +++ b/include/libcamera/object.h @@ -52,6 +52,8 @@ private: void invokeMethod(BoundMethodBase *method, void *pack); + void notifyThreadMove(); + void connect(SignalBase *signal); void disconnect(SignalBase *signal); diff --git a/src/libcamera/include/message.h b/src/libcamera/include/message.h index 92717e31..1cfde566 100644 --- a/src/libcamera/include/message.h +++ b/src/libcamera/include/message.h @@ -23,6 +23,7 @@ public: enum Type { None = 0, InvokeMessage = 1, + ThreadMoveMessage = 2, UserMessage = 1000, }; diff --git a/src/libcamera/message.cpp b/src/libcamera/message.cpp index f6c39d40..efafb655 100644 --- a/src/libcamera/message.cpp +++ b/src/libcamera/message.cpp @@ -47,6 +47,8 @@ std::atomic_uint Message::nextUserType_{ Message::UserMessage }; * \brief Invalid message type * \var Message::InvokeMessage * \brief Asynchronous method invocation across threads + * \var Message::ThreadMoveMessage + * \brief Object is being moved to a different thread * \var Message::UserMessage * \brief First value available for user-defined messages */ diff --git a/src/libcamera/object.cpp b/src/libcamera/object.cpp index 7d70ce21..bbb28f26 100644 --- a/src/libcamera/object.cpp +++ b/src/libcamera/object.cpp @@ -135,6 +135,10 @@ void Object::invokeMethod(BoundMethodBase *method, void *args) * This method moves the object from the current thread to the new \a thread. * It shall be called from the thread in which the object currently lives, * otherwise the behaviour is undefined. + * + * Before the object is moved, a Message::ThreadMoveMessage message is sent to + * it. The message() method can be reimplement in derived classes to be notified + * of the upcoming thread move and perform any required processing. */ void Object::moveToThread(Thread *thread) { @@ -143,9 +147,17 @@ void Object::moveToThread(Thread *thread) if (thread_ == thread) return; + notifyThreadMove(); + thread->moveObject(this); } +void Object::notifyThreadMove() +{ + Message msg(Message::ThreadMoveMessage); + message(&msg); +} + void Object::connect(SignalBase *signal) { signals_.push_back(signal); |