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
qohoseventdispatcher.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include "qohosjsmain.h"
7
8QOhosEventDispatcher::QOhosEventDispatcher(QObject *parent) :
9 QUnixEventDispatcherQPA(parent)
10{
11 if (QtOhos::blockEventLoopsWhenSuspended())
12 QOhosEventDispatcherStopper::instance()->addEventDispatcher(this);
13}
14
20
21enum States {Running = 0, StopRequest = 1, Stopping = 2};
22
24{
25 int prevState = m_stopRequest.fetchAndStoreAcquire(Running);
26 if (prevState == Stopping) {
27 m_semaphore.release();
28 wakeUp();
29 } else if (prevState == Running) {
30 qWarning("Error: start without corresponding stop");
31 }
32 //else if prevState == StopRequest, no action needed
33}
34
36{
37 if (m_stopRequest.testAndSetAcquire(Running, StopRequest))
38 wakeUp();
39 else
40 qWarning("Error: start/stop out of sync");
41}
42
44{
45 m_goingToStop.storeRelaxed(stop);
46 if (!stop)
47 wakeUp();
48}
49
50bool QOhosEventDispatcher::processEvents(QEventLoop::ProcessEventsFlags flags)
51{
52 if (m_goingToStop.loadRelaxed())
53 flags |= QEventLoop::ExcludeSocketNotifiers | QEventLoop::X11ExcludeTimers;
54
55 {
56 QOhosDeadlockProtector protector;
57 if (protector.acquire() && m_stopRequest.testAndSetAcquire(StopRequest, Stopping)) {
58 m_semaphore.acquire();
59 wakeUp();
60 }
61 }
62
63 return QUnixEventDispatcherQPA::processEvents(flags);
64}
65
67{
68 static QOhosEventDispatcherStopper ohosEventDispatcherStopper;
69 return &ohosEventDispatcherStopper;
70}
71
73{
74 QMutexLocker lock(&m_mutex);
75 if (!m_started.testAndSetOrdered(0, 1))
76 return;
77
78 for (QOhosEventDispatcher *d : std::as_const(m_dispatchers))
79 d->start();
80}
81
83{
84 QMutexLocker lock(&m_mutex);
85 if (!m_started.testAndSetOrdered(1, 0))
86 return;
87
88 for (QOhosEventDispatcher *d : std::as_const(m_dispatchers))
89 d->stop();
90}
91
93{
94 QMutexLocker lock(&m_mutex);
95 m_dispatchers.push_back(dispatcher);
96}
97
99{
100 QMutexLocker lock(&m_mutex);
101 m_dispatchers.erase(std::find(m_dispatchers.begin(), m_dispatchers.end(), dispatcher));
102}
103
105{
106 QMutexLocker lock(&m_mutex);
107 for (QOhosEventDispatcher *d : std::as_const(m_dispatchers))
108 d->goingToStop(stop);
109}
static QOhosEventDispatcherStopper * instance()
void addEventDispatcher(QOhosEventDispatcher *dispatcher)
void removeEventDispatcher(QOhosEventDispatcher *dispatcher)
bool processEvents(QEventLoop::ProcessEventsFlags flags) override
Processes pending events that match flags until there are no more events to process.
bool blockEventLoopsWhenSuspended()