src/network/socket/qnativesocketengine_unix.cpp
changeset 30 5dc02b23752f
parent 29 b72c6db6890b
child 33 3e2da88830cd
--- a/src/network/socket/qnativesocketengine_unix.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/network/socket/qnativesocketengine_unix.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -44,8 +44,8 @@
 #include "private/qnet_unix_p.h"
 #include "qiodevice.h"
 #include "qhostaddress.h"
+#include "qelapsedtimer.h"
 #include "qvarlengtharray.h"
-#include "qdatetime.h"
 #include <time.h>
 #include <errno.h>
 #include <fcntl.h>
@@ -851,7 +851,11 @@
     // Symbian does not support signals natively and Open C returns EINTR when moving to offline
     writtenBytes = ::write(socketDescriptor, data, len);
 #else
-    writtenBytes = qt_safe_write(socketDescriptor, data, len);
+    // loop while ::write() returns -1 and errno == EINTR, in case
+    // of an interrupting signal.
+    do {
+        writtenBytes = qt_safe_write(socketDescriptor, data, len);
+    } while (writtenBytes < 0 && errno == EINTR);
 #endif
 
     if (writtenBytes < 0) {
@@ -895,7 +899,9 @@
 #ifdef Q_OS_SYMBIAN
     r = ::read(socketDescriptor, data, maxSize);
 #else
-    r = qt_safe_read(socketDescriptor, data, maxSize);
+    do {
+        r = qt_safe_read(socketDescriptor, data, maxSize);
+    } while (r == -1 && errno == EINTR);
 #endif
 
     if (r < 0) {
@@ -1011,7 +1017,7 @@
 #ifndef Q_OS_SYMBIAN
     ret = qt_safe_select(socketDescriptor + 1, &fdread, &fdwrite, 0, timeout < 0 ? 0 : &tv);
 #else
-    QTime timer;
+    QElapsedTimer timer;
     timer.start();
 
     do {