From patchwork Sat Aug 17 15:21:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 1835 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0FF6A61936 for ; Sat, 17 Aug 2019 17:21:19 +0200 (CEST) Received: from pendragon.bb.dnainternet.fi (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A1A43556 for ; Sat, 17 Aug 2019 17:21:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1566055278; bh=dLylKzqflPNpJuG/m2k/mjzkBGECXSMJgQYkxMJKZ/8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=sgCpm02AmszFbWYDsOd6fVKe7lte2Yh4UiZ+KqYHAJn/TbSLr4s2adom3s/RM+nVK yIT8zQd0EUSIqonPHYba8nS70XlpQv1NKYrKL/0feXlLr4p2++fw+y5xoUo8FHvcQQ dVoGQU+v8k11IP6PPjm9LwCyB6R+GY7mqbS80Vm0= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sat, 17 Aug 2019 18:21:03 +0300 Message-Id: <20190817152104.10834-18-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190817152104.10834-1-laurent.pinchart@ideasonboard.com> References: <20190817152104.10834-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 17/18] test: object: Extend object test to verify parent-child relationships X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 17 Aug 2019 15:21:20 -0000 The test verifies correct behaviour of parent-child relationships in relation to thread affinity. Signed-off-by: Laurent Pinchart Reviewed-by: Jacopo Mondi Reviewed-by: Niklas Söderlund --- test/object.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/test/object.cpp b/test/object.cpp index 3f1f700d1b39..16118971c755 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -25,8 +25,8 @@ public: MessageReceived, }; - InstrumentedObject() - : status_(NoMessage) + InstrumentedObject(Object *parent = nullptr) + : Object(parent), status_(NoMessage) { } @@ -51,22 +51,82 @@ class ObjectTest : public Test protected: int init() { + /* + * Create a hierarchy of objects: + * A -> B -> C + * \->D + * E + */ a_ = new InstrumentedObject(); + b_ = new InstrumentedObject(a_); + c_ = new InstrumentedObject(b_); + d_ = new InstrumentedObject(a_); + e_ = new InstrumentedObject(); + f_ = nullptr; + return TestPass; } int run() { - /* Verify that moving an object to a different thread succeeds. */ - a_->moveToThread(&thread_); + /* Verify the parent-child relationships. */ + if (a_->parent() != nullptr || b_->parent() != a_ || + c_->parent() != b_ || d_->parent() != a_ || + e_->parent() != nullptr) { + cout << "Incorrect parent-child relationships" << endl; + return TestFail; + } - if (a_->thread() != &thread_ || a_->thread() == Thread::current()) { + /* + * Verify that moving an object with no parent to a different + * thread succeeds. + */ + e_->moveToThread(&thread_); + + if (e_->thread() != &thread_ || e_->thread() == Thread::current()) { cout << "Failed to move object to thread" << endl; return TestFail; } + /* + * Verify that moving an object with a parent to a different + * thread fails. This results in an undefined behaviour, the + * test thus depends on the internal implementation returning + * without performing any change. + */ + b_->moveToThread(&thread_); + + if (b_->thread() != Thread::current()) { + cout << "Moving object with parent to thread shouldn't succeed" << endl; + return TestFail; + } + + /* + * Verify that moving an object with children to a different + * thread moves all the children. + */ + a_->moveToThread(&thread_); + + if (a_->thread() != &thread_ || b_->thread() != &thread_ || + c_->thread() != &thread_ || d_->thread() != &thread_) { + cout << "Failed to move children to thread" << endl; + return TestFail; + } + + /* Verify that objects are bound to the thread of their parent. */ + f_ = new InstrumentedObject(d_); + + if (f_->thread() != &thread_) { + cout << "Failed to bind child to parent thread" << endl; + return TestFail; + } + /* Verify that objects receive a ThreadMoveMessage when moved. */ - if (a_->status() != InstrumentedObject::MessageReceived) { + if (a_->status() != InstrumentedObject::MessageReceived || + b_->status() != InstrumentedObject::MessageReceived || + c_->status() != InstrumentedObject::MessageReceived || + d_->status() != InstrumentedObject::MessageReceived || + e_->status() != InstrumentedObject::MessageReceived) { cout << "Moving object didn't deliver ThreadMoveMessage" << endl; return TestFail; } @@ -77,10 +137,20 @@ protected: void cleanup() { delete a_; + delete b_; + delete c_; + delete d_; + delete e_; + delete f_; } private: InstrumentedObject *a_; + InstrumentedObject *b_; + InstrumentedObject *c_; + InstrumentedObject *d_; + InstrumentedObject *e_; + InstrumentedObject *f_; Thread thread_; };