Skip to content

Commit 9885e9e

Browse files
committed
fix: try to fix crash in processWaylandEvents
1 parent 0522f1c commit 9885e9e

File tree

3 files changed

+32
-17
lines changed

3 files changed

+32
-17
lines changed

src/server/kernel/private/wserver_p.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ class Q_DECL_HIDDEN WServerPrivate : public WObjectPrivate
2222
{
2323
public:
2424
WServerPrivate(WServer *qq);
25-
~WServerPrivate();
25+
~WServerPrivate() override;
2626

2727
void init();
2828
void stop();
2929

30+
void dispatchEvents();
31+
void flush();
32+
3033
void initSocket(WSocket *socketServer);
3134

3235
W_DECLARE_PUBLIC(WServer)

src/server/kernel/wserver.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include <QAbstractEventDispatcher>
2626
#include <QSocketNotifier>
2727
#include <QMutex>
28-
#include <QDebug>
28+
#include <QLoggingCategory>
2929
#include <QProcess>
3030
#include <QLocalServer>
3131
#include <QLocalSocket>
@@ -38,6 +38,8 @@
3838
QW_USE_NAMESPACE
3939
WAYLIB_SERVER_BEGIN_NAMESPACE
4040

41+
Q_LOGGING_CATEGORY(qLcWlrServer, "waylib.server.core")
42+
4143
static bool globalFilter(const wl_client *client,
4244
const wl_global *global,
4345
void *data) {
@@ -102,20 +104,20 @@ void WServerPrivate::init()
102104
}
103105

104106
loop = wl_display_get_event_loop(display->handle());
105-
int fd = wl_event_loop_get_fd(loop);
106-
107-
auto processWaylandEvents = [this] {
108-
int ret = wl_event_loop_dispatch(loop, 0);
109-
if (ret)
110-
fprintf(stderr, "wl_event_loop_dispatch error: %d\n", ret);
111-
wl_display_flush_clients(display->handle());
112-
};
107+
const int fd = wl_event_loop_get_fd(loop);
108+
if (fd == -1) {
109+
qCFatal(qLcWlrServer) << "Did not get the file descriptor for the event loop";
110+
}
113111

114112
sockNot.reset(new QSocketNotifier(fd, QSocketNotifier::Read));
115-
QObject::connect(sockNot.get(), &QSocketNotifier::activated, q, processWaylandEvents);
113+
QObject::connect(sockNot.get(), &QSocketNotifier::activated, q, [this] {
114+
dispatchEvents();
115+
});
116116

117-
QAbstractEventDispatcher *dispatcher = QThread::currentThread()->eventDispatcher();
118-
QObject::connect(dispatcher, &QAbstractEventDispatcher::aboutToBlock, q, processWaylandEvents);
117+
QAbstractEventDispatcher *dispatcher = QCoreApplication::eventDispatcher();
118+
QObject::connect(dispatcher, &QAbstractEventDispatcher::aboutToBlock, q, [this] {
119+
flush();
120+
});
119121

120122
for (auto socket : std::as_const(sockets))
121123
initSocket(socket);
@@ -142,6 +144,18 @@ void WServerPrivate::stop()
142144
QThread::currentThread()->eventDispatcher()->disconnect(q);
143145
}
144146

147+
void WServerPrivate::dispatchEvents()
148+
{
149+
int ret = wl_event_loop_dispatch(loop, 0);
150+
if (ret)
151+
qCCritical(qLcWlrServer, "wl_event_loop_dispatch error: %d\n", ret);
152+
}
153+
154+
void WServerPrivate::flush()
155+
{
156+
wl_display_flush_clients(display->handle());
157+
}
158+
145159
void WServerPrivate::initSocket(WSocket *socketServer)
146160
{
147161
bool ok = socketServer->listen(display->handle());

src/server/kernel/wsocket.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
#include <sys/un.h>
2020
#include <signal.h>
2121

22-
struct wl_event_source;
23-
2422
WAYLIB_SERVER_BEGIN_NAMESPACE
2523

2624
#define LOCK_SUFFIX ".lock"
@@ -656,8 +654,8 @@ WClient *WSocket::addClient(wl_client *client)
656654
{
657655
W_D(WSocket);
658656

659-
WClient *wclient = nullptr;
660-
if ((wclient = WClient::get(client))) {
657+
WClient *wclient = WClient::get(client);
658+
if (wclient) {
661659
if (wclient->socket() != this)
662660
return nullptr;
663661
if (d->clients.contains(wclient))

0 commit comments

Comments
 (0)