]> source.dussan.org Git - tigervnc.git/commitdiff
Use send() with MSG_DONTWAIT when possible
authorPeter Åstrand (astrand) <astrand@cendio.se>
Tue, 10 Oct 2017 11:56:51 +0000 (13:56 +0200)
committerPeter Åstrand (astrand) <astrand@cendio.se>
Wed, 8 Nov 2017 09:40:13 +0000 (10:40 +0100)
common/rdr/FdOutStream.cxx

index 29e864fc314c03b1b94786912112601b88590b99..32245a6bc3eae5f9d8afc9793544b56a25284aaf 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/time.h>
+#include <sys/socket.h>
 #endif
 
 /* Old systems have select() in sys/time.h */
@@ -193,7 +194,14 @@ int FdOutStream::writeWithTimeout(const void* data, int length, int timeoutms)
     return 0;
 
   do {
-    n = ::write(fd, data, length);
+    // select only guarantees that you can write SO_SNDLOWAT without
+    // blocking, which is normally 1. Use MSG_DONTWAIT to avoid
+    // blocking, when possible.
+#ifndef MSG_DONTWAIT
+    n = ::send(fd, (const char*)data, length, 0);
+#else
+    n = ::send(fd, (const char*)data, length, MSG_DONTWAIT);
+#endif
   } while (n < 0 && (errno == EINTR));
 
   if (n < 0)