From 01590c3f780598572b3a18decefed55ae8e51059 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 22 Mar 2020 00:52:28 +0200 Subject: qcam: Remove custom event dispatcher The qcam application installs a custom event dispatcher based on the Qt event loop. As the camera manager now creates an internal thread, it doesn't use that event dispatcher of the application thread at all. Furthermore, the custom event dispatcher is buggy, as it doesn't dispatch messages posted to the main thread's event loop. This isn't an issue as no messages are posted there in the first place, but would cause incorrect behaviour if we were to use that feature (for instance to deliver signals from the camera manager thread to the application thread). Fixing the event dispatcher requires a change in the libcamera public API, as there's currently no way to dispatch messages using the public API (Thread::dispatchMessages() is not exposed). This isn't worth it at the moment, so just remove the custom event dispatcher. If qcam later needs the libcamera request and buffer completion signals to be delivered in the application thread, it will need to handle that internally, using Qt's cross-thread signal delivery. Signed-off-by: Laurent Pinchart Reviewed-by: Kieran Bingham --- src/qcam/qt_event_dispatcher.cpp | 152 --------------------------------------- 1 file changed, 152 deletions(-) delete mode 100644 src/qcam/qt_event_dispatcher.cpp (limited to 'src/qcam/qt_event_dispatcher.cpp') diff --git a/src/qcam/qt_event_dispatcher.cpp b/src/qcam/qt_event_dispatcher.cpp deleted file mode 100644 index 2780c912..00000000 --- a/src/qcam/qt_event_dispatcher.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (C) 2019, Google Inc. - * - * qt_event_dispatcher.cpp - qcam - Qt-based event dispatcher - */ - -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "qt_event_dispatcher.h" - -using namespace libcamera; - -QtEventDispatcher::QtEventDispatcher() -{ -} - -QtEventDispatcher::~QtEventDispatcher() -{ - for (auto &it : notifiers_) { - NotifierSet &set = it.second; - delete set.read.qnotifier; - delete set.write.qnotifier; - delete set.exception.qnotifier; - } -} - -void QtEventDispatcher::registerEventNotifier(EventNotifier *notifier) -{ - NotifierSet &set = notifiers_[notifier->fd()]; - QSocketNotifier::Type qtype; - void (QtEventDispatcher::*method)(int); - NotifierPair *pair; - - switch (notifier->type()) { - case EventNotifier::Read: - default: - qtype = QSocketNotifier::Read; - method = &QtEventDispatcher::readNotifierActivated; - pair = &set.read; - break; - - case EventNotifier::Write: - qtype = QSocketNotifier::Write; - method = &QtEventDispatcher::writeNotifierActivated; - pair = &set.write; - break; - - case EventNotifier::Exception: - qtype = QSocketNotifier::Exception; - method = &QtEventDispatcher::exceptionNotifierActivated; - pair = &set.exception; - break; - } - - QSocketNotifier *qnotifier = new QSocketNotifier(notifier->fd(), qtype); - connect(qnotifier, &QSocketNotifier::activated, this, method); - pair->notifier = notifier; - pair->qnotifier = qnotifier; -} - -void QtEventDispatcher::unregisterEventNotifier(EventNotifier *notifier) -{ - NotifierSet &set = notifiers_[notifier->fd()]; - NotifierPair *pair; - - switch (notifier->type()) { - case EventNotifier::Read: - default: - pair = &set.read; - break; - - case EventNotifier::Write: - pair = &set.write; - break; - - case EventNotifier::Exception: - pair = &set.exception; - break; - } - - delete pair->qnotifier; - pair->qnotifier = nullptr; - pair->notifier = nullptr; -} - -void QtEventDispatcher::readNotifierActivated(int socket) -{ - EventNotifier *notifier = notifiers_[socket].read.notifier; - notifier->activated.emit(notifier); -} - -void QtEventDispatcher::writeNotifierActivated(int socket) -{ - EventNotifier *notifier = notifiers_[socket].write.notifier; - notifier->activated.emit(notifier); -} - -void QtEventDispatcher::exceptionNotifierActivated(int socket) -{ - EventNotifier *notifier = notifiers_[socket].exception.notifier; - notifier->activated.emit(notifier); -} - -void QtEventDispatcher::registerTimer(Timer *timer) -{ - std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); - std::chrono::steady_clock::duration duration = timer->deadline() - now; - std::chrono::milliseconds msec = - std::chrono::duration_cast(duration); - int timerId = startTimer(msec.count()); - timers_[timerId] = timer; - timerIds_[timer] = timerId; -} - -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); -} - -void QtEventDispatcher::timerEvent(QTimerEvent *event) -{ - Timer *timer = timers_[event->timerId()]; - timer->stop(); - timer->timeout.emit(timer); -} - -void QtEventDispatcher::processEvents() -{ - std::cout << "QtEventDispatcher::processEvents() should not be called" - << std::endl; -} - -void QtEventDispatcher::interrupt() -{ - QCoreApplication::eventDispatcher()->interrupt(); -} -- cgit v1.2.1