summaryrefslogtreecommitdiff
path: root/src/libcamera/thread.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-12 14:19:06 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-17 18:47:17 +0300
commit2b25819ec07e8de0b4be658c7d46f6c1c495766d (patch)
tree984c9c1785413b75bbe4825eca2895c6848f09e0 /src/libcamera/thread.cpp
parent4d9f1a0efc038e12b5cfdb53cb89fad9976fccb2 (diff)
libcamera: object: Create parent-child relationships
Add a parent Object to Object instances, and track the parent-children relationships. Children are bound to the same thread as their parent, and moving an Object to a thread automatically moves all its children. 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 'src/libcamera/thread.cpp')
-rw-r--r--src/libcamera/thread.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp
index 24422f7b..872ad1bd 100644
--- a/src/libcamera/thread.cpp
+++ b/src/libcamera/thread.cpp
@@ -448,7 +448,7 @@ void Thread::dispatchMessages()
}
/**
- * \brief Move an \a object to the thread
+ * \brief Move an \a object and all its children to the thread
* \param[in] object The object
*/
void Thread::moveObject(Object *object)
@@ -460,6 +460,12 @@ void Thread::moveObject(Object *object)
MutexLocker lockerTo(targetData->mutex_, std::defer_lock);
std::lock(lockerFrom, lockerTo);
+ moveObject(object, currentData, targetData);
+}
+
+void Thread::moveObject(Object *object, ThreadData *currentData,
+ ThreadData *targetData)
+{
/* Move pending messages to the message queue of the new thread. */
if (object->pendingMessages_) {
unsigned int movedMessages = 0;
@@ -483,6 +489,10 @@ void Thread::moveObject(Object *object)
}
object->thread_ = this;
+
+ /* Move all children. */
+ for (auto child : object->children_)
+ moveObject(child, currentData, targetData);
}
}; /* namespace libcamera */