Merge branch 'js/sleep-without-select'
authorJunio C Hamano <gitster@pobox.com>
Wed, 24 Jun 2015 19:21:47 +0000 (12:21 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 24 Jun 2015 19:21:47 +0000 (12:21 -0700)
Portability fix.

* js/sleep-without-select:
lockfile: wait using sleep_millisec() instead of select()
lockfile: convert retry timeout computations to millisecond
help.c: wrap wait-only poll() invocation in sleep_millisec()
lockfile: replace random() by rand()

cache.h
help.c
lockfile.c
wrapper.c
diff --git a/cache.h b/cache.h
index 571c98f5e2406afad1352fcaddd1efff1af65cc1..fe840e34a591a4ecd2b11c611349127cc65e4ecf 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1698,5 +1698,6 @@ int stat_validity_check(struct stat_validity *sv, const char *path);
 void stat_validity_update(struct stat_validity *sv, int fd);
 
 int versioncmp(const char *s1, const char *s2);
+void sleep_millisec(int millisec);
 
 #endif /* CACHE_H */
diff --git a/help.c b/help.c
index 80ca8ee68d5af25b43314d351bc7ad09d9d9d03b..d996b340669a66d0b1619472fedf5c11b940d7c5 100644 (file)
--- a/help.c
+++ b/help.c
@@ -394,7 +394,7 @@ const char *help_unknown_cmd(const char *cmd)
                if (autocorrect > 0) {
                        fprintf_ln(stderr, _("in %0.1f seconds automatically..."),
                                (float)autocorrect/10.0);
-                       poll(NULL, 0, autocorrect * 100);
+                       sleep_millisec(autocorrect * 100);
                }
                return assumed;
        }
index 5a93bc7bc2425bf01e88f55024854225d6a78aca..993bb8274833651159cec6f0571b5b555ea073ca 100644 (file)
@@ -157,14 +157,6 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
        return lk->fd;
 }
 
-static int sleep_microseconds(long us)
-{
-       struct timeval tv;
-       tv.tv_sec = 0;
-       tv.tv_usec = us;
-       return select(0, NULL, NULL, NULL, &tv);
-}
-
 /*
  * Constants defining the gaps between attempts to lock a file. The
  * first backoff period is approximately INITIAL_BACKOFF_MS
@@ -184,27 +176,22 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
 {
        int n = 1;
        int multiplier = 1;
-       long remaining_us = 0;
+       long remaining_ms = 0;
        static int random_initialized = 0;
 
        if (timeout_ms == 0)
                return lock_file(lk, path, flags);
 
        if (!random_initialized) {
-               srandom((unsigned int)getpid());
+               srand((unsigned int)getpid());
                random_initialized = 1;
        }
 
-       if (timeout_ms > 0) {
-               /* avoid overflow */
-               if (timeout_ms <= LONG_MAX / 1000)
-                       remaining_us = timeout_ms * 1000;
-               else
-                       remaining_us = LONG_MAX;
-       }
+       if (timeout_ms > 0)
+               remaining_ms = timeout_ms;
 
        while (1) {
-               long backoff_ms, wait_us;
+               long backoff_ms, wait_ms;
                int fd;
 
                fd = lock_file(lk, path, flags);
@@ -213,14 +200,14 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
                        return fd; /* success */
                else if (errno != EEXIST)
                        return -1; /* failure other than lock held */
-               else if (timeout_ms > 0 && remaining_us <= 0)
+               else if (timeout_ms > 0 && remaining_ms <= 0)
                        return -1; /* failure due to timeout */
 
                backoff_ms = multiplier * INITIAL_BACKOFF_MS;
                /* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
-               wait_us = (750 + random() % 500) * backoff_ms;
-               sleep_microseconds(wait_us);
-               remaining_us -= wait_us;
+               wait_ms = (750 + rand() % 500) * backoff_ms / 1000;
+               sleep_millisec(wait_ms);
+               remaining_ms -= wait_ms;
 
                /* Recursion: (n+1)^2 = n^2 + 2n + 1 */
                multiplier += 2*n + 1;
index c1a663fd592133b3e26314f3d598a8bca8bcceb1..ff49807948f3c406fe73511cec4ef4e2b2df186a 100644 (file)
--- a/wrapper.c
+++ b/wrapper.c
@@ -595,3 +595,8 @@ int write_file(const char *path, int fatal, const char *fmt, ...)
        }
        return 0;
 }
+
+void sleep_millisec(int millisec)
+{
+       poll(NULL, 0, millisec);
+}