--- 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 {