]> granicus.if.org Git - neomutt/commitdiff
Convert raw_socket_poll() to use gettimeofday().
authorKevin McCarthy <kevin@8t8.us>
Fri, 28 Jul 2017 17:54:51 +0000 (10:54 -0700)
committerRichard Russon <rich@flatcap.org>
Thu, 3 Aug 2017 15:56:12 +0000 (16:56 +0100)
As long as gettimeofday() is supported, it's better to be consistent
within mutt and ensure greater portability.

Change the raw_socket_poll() wait timer to count milliseconds, like
the mutt_progess_update() code.

Thanks to Vincent Lefèvre for his, as always, invaluable advice.

mutt_socket.c

index 2bfed800eec48a691d60c0ebd0db2c80571ac363..3f0b44c1d211b796429a7edd4bf32047247783e2 100644 (file)
@@ -32,6 +32,7 @@
 #include <string.h>
 #include <sys/select.h>
 #include <sys/socket.h>
+#include <sys/time.h>
 #include <unistd.h>
 #include "mutt_socket.h"
 #include "globals.h"
@@ -387,25 +388,26 @@ int raw_socket_write(struct Connection *conn, const char *buf, size_t count)
 int raw_socket_poll(struct Connection *conn, time_t wait_secs)
 {
   fd_set rfds;
-  struct timeval tv;
-  struct timespec pre_t, post_t;
-  time_t sleep_secs;
+  unsigned long wait_millis, post_t_millis;
+  struct timeval tv, pre_t, post_t;
   int rv;
 
   if (conn->fd < 0)
     return -1;
 
+  wait_millis = wait_secs * 1000UL;
+
   while (true)
   {
-    tv.tv_sec = wait_secs;
-    tv.tv_usec = 0;
+    tv.tv_sec = wait_millis / 1000;
+    tv.tv_usec = (wait_millis % 1000) * 1000;
 
     FD_ZERO(&rfds);
     FD_SET(conn->fd, &rfds);
 
-    clock_gettime(CLOCK_MONOTONIC, &pre_t);
+    gettimeofday(&pre_t, NULL);
     rv = select(conn->fd + 1, &rfds, NULL, NULL, &tv);
-    clock_gettime(CLOCK_MONOTONIC, &post_t);
+    gettimeofday(&post_t, NULL);
 
     if (rv > 0 || (rv < 0 && errno != EINTR))
       return rv;
@@ -413,10 +415,11 @@ int raw_socket_poll(struct Connection *conn, time_t wait_secs)
     if (SigInt)
       mutt_query_exit();
 
-    sleep_secs = post_t.tv_sec - pre_t.tv_sec;
-    if (wait_secs <= sleep_secs)
+    wait_millis += (pre_t.tv_sec * 1000UL) + (pre_t.tv_usec / 1000);
+    post_t_millis = (post_t.tv_sec * 1000UL) + (post_t.tv_usec / 1000);
+    if (wait_millis <= post_t_millis)
       return 0;
-    wait_secs -= sleep_secs;
+    wait_millis -= post_t_millis;
   }
 }