summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qabstractsocket.cpp14
-rw-r--r--src/network/socket/qabstractsocket_p.h2
-rw-r--r--src/network/socket/qlocalsocket_unix.cpp4
3 files changed, 19 insertions, 1 deletions
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 975332a14ab..eb95d891e42 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -1045,7 +1045,7 @@ void QAbstractSocketPrivate::_q_connectToNextAddress()
host = addresses.takeFirst();
#if defined(QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::_q_connectToNextAddress(), connecting to %s:%i, %d left to try",
- host.toString().toLatin1().constData(), port, addresses.count());
+ host.toString().toLatin1().constData(), port, int(addresses.count()));
#endif
if (cachedSocketDescriptor == -1 && !initSocketLayer(host.protocol())) {
@@ -1247,6 +1247,9 @@ void QAbstractSocketPrivate::emitReadyRead(int channel)
void QAbstractSocketPrivate::emitBytesWritten(qint64 bytes, int channel)
{
Q_Q(QAbstractSocket);
+
+ bytesWrittenEmissionCount++;
+
// Only emit bytesWritten() when not recursing.
if (!emittedBytesWritten && channel == currentWriteChannel) {
QScopedValueRollback<bool> r(emittedBytesWritten);
@@ -2265,6 +2268,8 @@ bool QAbstractSocket::waitForBytesWritten(int msecs)
if (d->writeBuffer.isEmpty())
return false;
+ const quint32 bwEmissionCountAtEntry = d->bytesWrittenEmissionCount;
+
QDeadlineTimer deadline{msecs};
// handle a socket in connecting state
@@ -2304,6 +2309,13 @@ bool QAbstractSocket::waitForBytesWritten(int msecs)
qDebug("QAbstractSocket::waitForBytesWritten returns true");
#endif
return true;
+ } else if (d->bytesWrittenEmissionCount != bwEmissionCountAtEntry) {
+ // A slot connected to any signal emitted by this method has written data, which
+ // fulfills the condition to return true that at least one byte has been written.
+#if defined (QABSTRACTSOCKET_DEBUG)
+ qDebug("QAbstractSocket::waitForBytesWritten returns true (write in signal handler)");
+#endif
+ return true;
}
}
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index 5f33eddbc7b..5a0a6489e2e 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -117,6 +117,8 @@ public:
bool hasPendingData = false;
bool hasPendingDatagram = false;
+ quint32 bytesWrittenEmissionCount = 0;
+
QTimer *connectTimer = nullptr;
int hostLookupId = -1;
diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp
index 76928bfb2c4..4e2a4e34e0e 100644
--- a/src/network/socket/qlocalsocket_unix.cpp
+++ b/src/network/socket/qlocalsocket_unix.cpp
@@ -68,7 +68,11 @@ void QLocalSocketPrivate::init()
// QIODevice signals
q->connect(&unixSocket, SIGNAL(bytesWritten(qint64)),
q, SIGNAL(bytesWritten(qint64)));
+ q->connect(&unixSocket, SIGNAL(channelBytesWritten(int, qint64)),
+ q, SIGNAL(channelBytesWritten(int, qint64)));
q->connect(&unixSocket, SIGNAL(readyRead()), q, SIGNAL(readyRead()));
+ q->connect(&unixSocket, SIGNAL(channelReadyRead(int)),
+ q, SIGNAL(channelReadyRead(int)));
// QAbstractSocket signals
q->connect(&unixSocket, SIGNAL(connected()), q, SIGNAL(connected()));
q->connect(&unixSocket, SIGNAL(disconnected()), q, SIGNAL(disconnected()));