From patchwork Fri Sep 27 20:16:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2038 Return-Path: Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id E44306165A for ; Fri, 27 Sep 2019 22:17:24 +0200 (CEST) X-Halon-ID: be08e3a9-e163-11e9-837a-0050569116f7 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [84.172.88.101]) by bin-vsp-out-03.atm.binero.net (Halon) with ESMTPA id be08e3a9-e163-11e9-837a-0050569116f7; Fri, 27 Sep 2019 22:16:52 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Fri, 27 Sep 2019 22:16:40 +0200 Message-Id: <20190927201641.813877-2-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190927201641.813877-1-niklas.soderlund@ragnatech.se> References: <20190927201641.813877-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 1/2] qcam: Fix unregister of not registered timer X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Sep 2019 20:17:25 -0000 If an unregistered timer is given to QtEventDispatcher::unregisterTimer() an error is printed and Qt gets confused and locks up. Fix this by following the libcamera documentation that passing a unregistered timer is a no-op. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/qcam/qt_event_dispatcher.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qcam/qt_event_dispatcher.cpp b/src/qcam/qt_event_dispatcher.cpp index 5ba451bf88cef6e8..98d2472c37856642 100644 --- a/src/qcam/qt_event_dispatcher.cpp +++ b/src/qcam/qt_event_dispatcher.cpp @@ -120,6 +120,9 @@ void QtEventDispatcher::registerTimer(Timer *timer) void QtEventDispatcher::unregisterTimer(Timer *timer) { auto it = timerIds_.find(timer); + if (it == timerIds_.end()) + return; + timers_.erase(it->second); killTimer(it->second); timerIds_.erase(it); From patchwork Fri Sep 27 20:16:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Niklas_S=C3=B6derlund?= X-Patchwork-Id: 2040 Return-Path: Received: from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net [195.74.38.228]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 337896165B for ; Fri, 27 Sep 2019 22:17:25 +0200 (CEST) X-Halon-ID: be73fba8-e163-11e9-837a-0050569116f7 Authorized-sender: niklas@soderlund.pp.se Received: from bismarck.berto.se (unknown [84.172.88.101]) by bin-vsp-out-03.atm.binero.net (Halon) with ESMTPA id be73fba8-e163-11e9-837a-0050569116f7; Fri, 27 Sep 2019 22:16:52 +0200 (CEST) From: =?utf-8?q?Niklas_S=C3=B6derlund?= To: libcamera-devel@lists.libcamera.org Date: Fri, 27 Sep 2019 22:16:41 +0200 Message-Id: <20190927201641.813877-3-niklas.soderlund@ragnatech.se> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190927201641.813877-1-niklas.soderlund@ragnatech.se> References: <20190927201641.813877-1-niklas.soderlund@ragnatech.se> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 2/2] qcam: Fix timers not emitting timeout signal X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 27 Sep 2019 20:17:25 -0000 The timer signal was never emitted in QtEventDispatcher::timerEvent(), this results in timers not working as designed running under the Qt event loop. Fix this by emitting the signal on timeout and stopping the timer. By stopping the timer unregisterTimer() is called which handles the cleanup. Signed-off-by: Niklas Söderlund Reviewed-by: Laurent Pinchart --- src/qcam/qt_event_dispatcher.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qcam/qt_event_dispatcher.cpp b/src/qcam/qt_event_dispatcher.cpp index 98d2472c37856642..d7d1fed290851e6e 100644 --- a/src/qcam/qt_event_dispatcher.cpp +++ b/src/qcam/qt_event_dispatcher.cpp @@ -131,9 +131,10 @@ void QtEventDispatcher::unregisterTimer(Timer *timer) void QtEventDispatcher::timerEvent(QTimerEvent *event) { auto it = timers_.find(event->timerId()); - timerIds_.erase(it->second); - killTimer(it->first); - timers_.erase(it); + Timer *timer = it->second; + + timer->stop(); + timer->timeout.emit(timer); } void QtEventDispatcher::processEvents()