summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2012-12-25 16:09:10 +0400
committerDenis Shienkov <denis.shienkov@gmail.com>2012-12-25 13:44:36 +0100
commit60a508d30c790c7b52f470b15566e171d4c8351c (patch)
tree79120c91dbffd95ea3c4ed723f1032995ed895a9 /src
parent87bb584beb730d52fafd9872da5b14b5dd3606e8 (diff)
downloadqtserialport-60a508d30c790c7b52f470b15566e171d4c8351c.tar.gz
Windows: Fix infinite Qt-event loop when processing EV_ERR
The cause of the infinite loop was to create a class CommOverlappedEventNotifier with event handle with manual-reset type. This handle is not reset to non signalled state after the event occur. Solution is to replace the type of handle to auto-reset with added post-processing using GetOverlappedResult(). Change-Id: I7ef90583686251cb8e6c851482c7a4c3021ca08b Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <denis.shienkov@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/serialport/serialport_win.cpp12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/serialport/serialport_win.cpp b/src/serialport/serialport_win.cpp
index f4eb321..c04d8fa 100644
--- a/src/serialport/serialport_win.cpp
+++ b/src/serialport/serialport_win.cpp
@@ -129,7 +129,7 @@ class CommOverlappedEventNotifier : public AbstractOverlappedEventNotifier
{
public:
CommOverlappedEventNotifier(SerialPortPrivate *d, DWORD eventMask, QObject *parent)
- : AbstractOverlappedEventNotifier(d, CommEvent, true, parent)
+ : AbstractOverlappedEventNotifier(d, CommEvent, false, parent)
, originalEventMask(eventMask), triggeredEventMask(0) {
::SetCommMask(dptr->descriptor, originalEventMask);
startWaitCommEvent();
@@ -138,12 +138,12 @@ public:
void startWaitCommEvent() { ::WaitCommEvent(dptr->descriptor, &triggeredEventMask, &o); }
virtual bool processCompletionRoutine() {
- bool ret = false;
+ DWORD numberOfBytesTransferred = 0;
+ ::GetOverlappedResult(dptr->descriptor, &o, &numberOfBytesTransferred, FALSE);
if (EV_ERR & triggeredEventMask)
- ret = dptr->processIoErrors();
- if (EV_RXCHAR & triggeredEventMask)
- ret = dptr->startAsyncRead();
- return ret;
+ dptr->processIoErrors();
+ dptr->startAsyncRead();
+ return true;
}
private: