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>
This commit is contained in:
@@ -23,6 +23,7 @@ public:
|
||||
enum Type {
|
||||
None = 0,
|
||||
InvokeMessage = 1,
|
||||
ThreadMoveMessage = 2,
|
||||
UserMessage = 1000,
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user