Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qandroideventdispatcher.cpp
Go to the documentation of this file.
1// Copyright (C) 2014 BogDan Vatra <bogdan@kde.org>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6
7using namespace Qt::StringLiterals;
8
9QAndroidEventDispatcher::QAndroidEventDispatcher(QObject *parent) :
10 QUnixEventDispatcherQPA(parent)
11{
14}
15
21
22enum States {Running = 0, StopRequest = 1, Stopping = 2};
23
25{
26 int prevState = m_stopRequest.fetchAndStoreAcquire(Running);
27 if (prevState == Stopping) {
28 m_semaphore.release();
29 wakeUp();
30 } else if (prevState == Running) {
31 qWarning("Error: start without corresponding stop");
32 }
33 //else if prevState == StopRequest, no action needed
34}
35
37{
38 if (m_stopRequest.testAndSetAcquire(Running, StopRequest))
39 wakeUp();
40 else
41 qWarning("Error: start/stop out of sync");
42}
43
45{
46 m_goingToStop.storeRelaxed(stop ? 1 : 0);
47 if (!stop)
48 wakeUp();
49}
50
51bool QAndroidEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
52{
53 if (m_goingToStop.loadRelaxed())
54 flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers;
55
56 {
57 QtAndroidPrivate::AndroidDeadlockProtector protector(
58 u"QAndroidEventDispatcher::processEvents()"_s);
59 if (m_stopRequest.testAndSetAcquire(StopRequest, Stopping) && protector.acquire()) {
60 m_semaphore.acquire();
61 wakeUp();
62 }
63 }
64
65 return QUnixEventDispatcherQPA::processEvents(flags);
66}
67
69{
70 Q_CONSTINIT static QAndroidEventDispatcherStopper androidEventDispatcherStopper;
71 return &androidEventDispatcherStopper;
72}
73
75{
76 QMutexLocker lock(&m_mutex);
77 if (!m_started.testAndSetOrdered(0, 1))
78 return;
79
80 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
81 d->start();
82}
83
85{
86 QMutexLocker lock(&m_mutex);
87 if (!m_started.testAndSetOrdered(1, 0))
88 return;
89
90 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
91 d->stop();
92}
93
95{
96 QMutexLocker lock(&m_mutex);
97 m_dispatchers.push_back(dispatcher);
98}
99
101{
102 QMutexLocker lock(&m_mutex);
103 m_dispatchers.erase(std::find(m_dispatchers.begin(), m_dispatchers.end(), dispatcher));
104}
105
107{
108 QMutexLocker lock(&m_mutex);
109 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
110 d->goingToStop(stop);
111}
static QAndroidEventDispatcherStopper * instance()
void removeEventDispatcher(QAndroidEventDispatcher *dispatcher)
void addEventDispatcher(QAndroidEventDispatcher *dispatcher)
bool processEvents(QEventLoop::ProcessEventsFlags flags) override
Processes pending events that match flags until there are no more events to process.
bool blockEventLoopsWhenSuspended()