summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2016-08-01 12:43:55 +0200
committerLiang Qi <liang.qi@qt.io>2016-08-01 18:57:25 +0200
commit10967b1443720116744ecfc42fe442681d149c5a (patch)
treea58a4a21239f8a4f4aefbdd9685101c5f005c2be /src
parent7ef82ae562bab6b8bf7043d8e377eff60bb87b8a (diff)
parent133dbd59fb04974149d2140b267fce91a7cfd4a2 (diff)
downloadqtserialport-10967b1443720116744ecfc42fe442681d149c5a.tar.gz
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/serialport/qserialport_win.cpp Change-Id: I8f3403d448ef2e51cf2870b331c61ab808393e34
Diffstat (limited to 'src')
-rw-r--r--src/serialport/qserialport.cpp9
-rw-r--r--src/serialport/qserialport_p.h2
-rw-r--r--src/serialport/qserialport_win.cpp22
3 files changed, 11 insertions, 22 deletions
diff --git a/src/serialport/qserialport.cpp b/src/serialport/qserialport.cpp
index f7656c5..532c149 100644
--- a/src/serialport/qserialport.cpp
+++ b/src/serialport/qserialport.cpp
@@ -110,7 +110,6 @@ QSerialPortPrivate::QSerialPortPrivate()
, startAsyncWriteTimer(0)
, originalEventMask(0)
, triggeredEventMask(0)
- , actualBytesToWrite(0)
#elif defined(Q_OS_UNIX)
, descriptor(-1)
, readNotifier(0)
@@ -1249,13 +1248,7 @@ qint64 QSerialPort::bytesAvailable() const
qint64 QSerialPort::bytesToWrite() const
{
Q_D(const QSerialPort);
- qint64 bytes = QIODevice::bytesToWrite();
-#ifdef Q_OS_WIN32
- bytes += d->actualBytesToWrite;
-#else
- bytes += d->writeBuffer.size();
-#endif
- return bytes;
+ return QIODevice::bytesToWrite() + d->writeBuffer.size();
}
/*!
diff --git a/src/serialport/qserialport_p.h b/src/serialport/qserialport_p.h
index cb300ad..e240798 100644
--- a/src/serialport/qserialport_p.h
+++ b/src/serialport/qserialport_p.h
@@ -206,6 +206,7 @@ public:
COMMTIMEOUTS restoredCommTimeouts;
HANDLE handle;
QByteArray readChunkBuffer;
+ QByteArray writeChunkBuffer;
bool communicationStarted;
bool writeStarted;
bool readStarted;
@@ -216,7 +217,6 @@ public:
OVERLAPPED writeCompletionOverlapped;
DWORD originalEventMask;
DWORD triggeredEventMask;
- qint64 actualBytesToWrite;
#elif defined(Q_OS_UNIX)
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 46fc9d9..9ab4448 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -210,7 +210,6 @@ void QSerialPortPrivate::close()
readStarted = false;
writeStarted = false;
writeBuffer.clear();
- actualBytesToWrite = 0;
if (settingsRestoredOnClose) {
::SetCommState(handle, &restoredDcb);
@@ -292,10 +291,8 @@ bool QSerialPortPrivate::clear(QSerialPort::Directions directions)
DWORD flags = 0;
if (directions & QSerialPort::Input)
flags |= PURGE_RXABORT | PURGE_RXCLEAR;
- if (directions & QSerialPort::Output) {
+ if (directions & QSerialPort::Output)
flags |= PURGE_TXABORT | PURGE_TXCLEAR;
- actualBytesToWrite = 0;
- }
if (!::PurgeComm(handle, flags)) {
setError(getSystemError());
return false;
@@ -369,7 +366,7 @@ bool QSerialPortPrivate::waitForReadyRead(int msecs)
bool QSerialPortPrivate::waitForBytesWritten(int msecs)
{
- if (writeBuffer.isEmpty())
+ if (writeBuffer.isEmpty() && writeChunkBuffer.isEmpty())
return false;
if (!writeStarted && !_q_startAsyncWrite())
@@ -498,12 +495,13 @@ bool QSerialPortPrivate::completeAsyncWrite(qint64 bytesTransferred)
if (writeStarted) {
if (bytesTransferred == qint64(-1)) {
+ writeChunkBuffer.clear();
writeStarted = false;
return false;
- } else if (bytesTransferred > 0) {
- writeBuffer.free(bytesTransferred);
- emit q->bytesWritten(bytesTransferred);
}
+ Q_ASSERT(bytesTransferred == writeChunkBuffer.size());
+ writeChunkBuffer.clear();
+ emit q->bytesWritten(bytesTransferred);
writeStarted = false;
}
@@ -570,10 +568,10 @@ bool QSerialPortPrivate::_q_startAsyncWrite()
if (writeBuffer.isEmpty() || writeStarted)
return true;
- const int writeBytes = writeBuffer.nextDataBlockSize();
+ writeChunkBuffer = writeBuffer.read();
::ZeroMemory(&writeCompletionOverlapped, sizeof(writeCompletionOverlapped));
- if (!::WriteFile(handle, writeBuffer.readPointer(),
- writeBytes, nullptr, &writeCompletionOverlapped)) {
+ if (!::WriteFile(handle, writeChunkBuffer.constData(),
+ writeChunkBuffer.size(), nullptr, &writeCompletionOverlapped)) {
QSerialPortErrorInfo error = getSystemError();
if (error.errorCode != QSerialPort::NoError) {
@@ -584,7 +582,6 @@ bool QSerialPortPrivate::_q_startAsyncWrite()
}
}
- actualBytesToWrite -= writeBytes;
writeStarted = true;
return true;
}
@@ -619,7 +616,6 @@ qint64 QSerialPortPrivate::writeData(const char *data, qint64 maxSize)
Q_Q(QSerialPort);
writeBuffer.append(data, maxSize);
- actualBytesToWrite += maxSize;
if (!writeBuffer.isEmpty() && !writeStarted) {
if (!startAsyncWriteTimer) {