From patchwork Thu Jul 11 12:56:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 1655 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2950160C2F for ; Thu, 11 Jul 2019 14:56:42 +0200 (CEST) Received: from pendragon.ideasonboard.com (softbank126163157105.bbtec.net [126.163.157.105]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A605831C for ; Thu, 11 Jul 2019 14:56:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1562849801; bh=tzemjhXXhncskt5OqDuq3eX8HGMa0oJZgFDtzp5ry80=; h=From:To:Subject:Date:From; b=BGeP5OOdURJXJd0ZXtt8b+qSckCCOgNbixHF0g845lro5ISxM4qE1Aig47Ux+0sBv /NugyLACBaHDEfnia2nOb8zSX0zO2qC95QGIL/pJvCHZPvFHkIJnurGJRQk5Hxik/s IIV+WleEEMVe2ffRdMAv8dDNOR2cUHldwDsbOhN4= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Thu, 11 Jul 2019 15:56:08 +0300 Message-Id: <20190711125609.7331-1-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/2] test: signal: Extend Signal test with multi-inheritance reeiver 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: Thu, 11 Jul 2019 12:56:42 -0000 Add tests that exercises the Object-related signal code paths (in particular automatic disconnection on Signal deletion) when the receiver inherits from multiple base classes, with Object being the second base. This tests the casts to and from Object * in the signal implementation. The new tests segfault due bugs in the signal/slot implementation. Signed-off-by: Laurent Pinchart --- test/signal.cpp | 74 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/test/signal.cpp b/test/signal.cpp index 79668b421511..9d8f985d15e5 100644 --- a/test/signal.cpp +++ b/test/signal.cpp @@ -32,6 +32,29 @@ public: } }; +class BaseClass +{ +public: + /* + * A virtual method is required in the base class, otherwise the compiler + * will always store Object before BaseClass in memory. + */ + virtual ~BaseClass() + { + } + + unsigned int data_[32]; +}; + +class SlotMulti : public BaseClass, public Object +{ +public: + void slot() + { + valueStatic_ = 1; + } +}; + class SignalTest : public Test { protected: @@ -69,6 +92,8 @@ protected: int run() { + /* ----------------- Signal -> !Object tests ---------------- */ + /* Test signal emission and reception. */ called_ = false; signalVoid_.connect(this, &SignalTest::slotVoid); @@ -149,6 +174,8 @@ protected: return TestFail; } + /* ----------------- Signal -> Object tests ----------------- */ + /* * Test automatic disconnection on object deletion. Connect the * slot twice to ensure all instances are disconnected. @@ -170,10 +197,10 @@ protected: * Test that signal deletion disconnects objects. This shall * not generate any valgrind warning. */ - Signal<> *signal = new Signal<>(); + Signal<> *dynamicSignal = new Signal<>(); slotObject = new SlotObject(); - signal->connect(slotObject, &SlotObject::slot); - delete signal; + dynamicSignal->connect(slotObject, &SlotObject::slot); + delete dynamicSignal; delete slotObject; /* Exercise the Object slot code paths. */ @@ -188,6 +215,47 @@ protected: delete slotObject; + /* --------- Signal -> Object (multiple inheritance) -------- */ + + /* + * Test automatic disconnection on object deletion. Connect the + * slot twice to ensure all instances are disconnected. + */ + signalVoid_.disconnect(); + + SlotMulti *slotMulti = new SlotMulti(); + signalVoid_.connect(slotMulti, &SlotMulti::slot); + signalVoid_.connect(slotMulti, &SlotMulti::slot); + delete slotMulti; + valueStatic_ = 0; + signalVoid_.emit(); + if (valueStatic_ != 0) { + cout << "Signal disconnection on object deletion test failed" << endl; + return TestFail; + } + + /* + * Test that signal deletion disconnects objects. This shall + * not generate any valgrind warning. + */ + dynamicSignal = new Signal<>(); + slotMulti = new SlotMulti(); + dynamicSignal->connect(slotMulti, &SlotMulti::slot); + delete dynamicSignal; + delete slotMulti; + + /* Exercise the Object slot code paths. */ + slotMulti = new SlotMulti(); + signalVoid_.connect(slotMulti, &SlotMulti::slot); + valueStatic_ = 0; + signalVoid_.emit(); + if (valueStatic_ == 0) { + cout << "Signal delivery for Object test failed" << endl; + return TestFail; + } + + delete slotMulti; + return TestPass; }