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// Qt-Security score:significant reason:default
4
7
8using namespace Qt::StringLiterals;
9
10QAndroidEventDispatcher::QAndroidEventDispatcher(QObject *parent) :
11 QUnixEventDispatcherQPA(parent)
12{
15}
16
22
23enum States {Running = 0, StopRequest = 1, Stopping = 2};
24
26{
27 int prevState = m_stopRequest.fetchAndStoreAcquire(Running);
28 if (prevState == Stopping) {
29 m_semaphore.release();
30 wakeUp();
31 } else if (prevState == Running) {
32 qWarning("Error: start without corresponding stop");
33 }
34 //else if prevState == StopRequest, no action needed
35}
36
38{
39 if (m_stopRequest.testAndSetAcquire(Running, StopRequest))
40 wakeUp();
41 else
42 qWarning("Error: start/stop out of sync");
43}
44
46{
47 m_goingToStop.storeRelaxed(stop ? 1 : 0);
48 if (!stop)
49 wakeUp();
50}
51
52bool QAndroidEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
53{
54 if (m_goingToStop.loadRelaxed())
55 flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers;
56
57 {
58 QtAndroidPrivate::AndroidDeadlockProtector protector(
59 u"QAndroidEventDispatcher::processEvents()"_s);
60 if (m_stopRequest.testAndSetAcquire(StopRequest, Stopping) && protector.acquire()) {
61 m_semaphore.acquire();
62 wakeUp();
63 }
64 }
65
66 return QUnixEventDispatcherQPA::processEvents(flags);
67}
68
70{
71 Q_CONSTINIT static QAndroidEventDispatcherStopper androidEventDispatcherStopper;
72 return &androidEventDispatcherStopper;
73}
74
76{
77 QMutexLocker lock(&m_mutex);
78 if (!m_started.testAndSetOrdered(0, 1))
79 return;
80
81 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
82 d->start();
83}
84
86{
87 QMutexLocker lock(&m_mutex);
88 if (!m_started.testAndSetOrdered(1, 0))
89 return;
90
91 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
92 d->stop();
93}
94
96{
97 QMutexLocker lock(&m_mutex);
98 m_dispatchers.push_back(dispatcher);
99}
100
102{
103 QMutexLocker lock(&m_mutex);
104 m_dispatchers.erase(std::find(m_dispatchers.begin(), m_dispatchers.end(), dispatcher));
105}
106
108{
109 QMutexLocker lock(&m_mutex);
110 for (QAndroidEventDispatcher *d : std::as_const(m_dispatchers))
111 d->goingToStop(stop);
112}
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()