Skip to content

Commit e1c0256

Browse files
committed
Fix GammaRay GUI not showing up on Windows
The target sends the TCP address via a QLocalSocket, but Windows is very prone to partial writes. Ensure all bytes are written before closing the socket. Simplified the launcher code, no need to use a while, as the target only sends 1 message. Ignore the readyRead that contain partial writes. Related to some comments in issue #959 (cherry picked from commit 95e6b92)
1 parent 7585c40 commit e1c0256

File tree

3 files changed

+36
-20
lines changed

3 files changed

+36
-20
lines changed

CHANGES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
Release Highlights
22
==================
33

4+
Version 3.2.2
5+
-------------
6+
* Fix GammaRay GUI not showing up on Windows
7+
48
Version 3.2.1
59
-------------
610
* Fix infinite in loop QuickSceneGraphModel::itemForSgNode() (#1070)

core/probesettings.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,16 @@ void ProbeSettingsReceiver::readyRead()
144144
}
145145
}
146146

147+
static void waitForBytesWritten(QLocalSocket &socket)
148+
{
149+
while (socket.state() == QLocalSocket::ConnectedState && socket.bytesToWrite() > 0) {
150+
if (!socket.waitForBytesWritten()) {
151+
qWarning() << Q_FUNC_INFO << "Failed to wait for bytes written";
152+
break;
153+
}
154+
}
155+
}
156+
147157
void ProbeSettingsReceiver::sendServerAddress(const QUrl &address)
148158
{
149159
if (!m_socket || m_socket->state() != QLocalSocket::ConnectedState)
@@ -153,7 +163,7 @@ void ProbeSettingsReceiver::sendServerAddress(const QUrl &address)
153163
msg << address;
154164
msg.write(m_socket);
155165

156-
m_socket->waitForBytesWritten();
166+
waitForBytesWritten(*m_socket);
157167
m_socket->close();
158168

159169
deleteLater();
@@ -170,7 +180,7 @@ void ProbeSettingsReceiver::sendServerLaunchError(const QString &reason)
170180
msg << reason;
171181
msg.write(m_socket);
172182

173-
m_socket->waitForBytesWritten();
183+
waitForBytesWritten(*m_socket);
174184
m_socket->close();
175185

176186
deleteLater();

launcher/core/launcher.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -357,26 +357,28 @@ void Launcher::newConnection()
357357

358358
void Launcher::readyRead()
359359
{
360-
while (Message::canReadMessage(d->socket)) {
361-
const auto msg = Message::readMessage(d->socket);
362-
switch (msg.type()) {
363-
case Protocol::ServerAddress: {
364-
msg >> d->serverAddress;
365-
break;
366-
}
367-
case Protocol::ServerLaunchError: {
368-
QString reason;
369-
msg >> reason;
370-
std::cerr << "Failed to start server: " << qPrintable(reason)
371-
<< std::endl;
372-
// TODO emit error signal to also notify qtcreator, etc
373-
break;
374-
}
375-
default:
376-
continue;
377-
}
360+
if (!Message::canReadMessage(d->socket)) {
361+
// it's a partial write, wait for rest of message
362+
return;
378363
}
379364

365+
const auto msg = Message::readMessage(d->socket);
366+
switch (msg.type()) {
367+
case Protocol::ServerAddress: {
368+
msg >> d->serverAddress;
369+
break;
370+
}
371+
case Protocol::ServerLaunchError: {
372+
QString reason;
373+
msg >> reason;
374+
std::cerr << "Failed to start server: " << qPrintable(reason)
375+
<< std::endl;
376+
// TODO emit error signal to also notify qtcreator, etc
377+
break;
378+
}
379+
}
380+
381+
380382
if (d->serverAddress.isEmpty())
381383
return;
382384

0 commit comments

Comments
 (0)