summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Junio C Hamano <gitster@pobox.com>2015-06-24 12:21:47 -0700
committerLibravatar Junio C Hamano <gitster@pobox.com>2015-06-24 12:21:47 -0700
commit510ab3f3c19566b43be02ec13c3326fa04a4a677 (patch)
tree22deebaa0dc0fc0229dd82d3fa4307d35ee84ac0
parentMerge branch 'es/utf8-stupid-compiler-workaround' (diff)
parentlockfile: wait using sleep_millisec() instead of select() (diff)
downloadtgif-510ab3f3c19566b43be02ec13c3326fa04a4a677.tar.xz
Merge branch 'js/sleep-without-select'
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()
-rw-r--r--cache.h1
-rw-r--r--help.c2
-rw-r--r--lockfile.c31
-rw-r--r--wrapper.c5
4 files changed, 16 insertions, 23 deletions
diff --git a/cache.h b/cache.h
index 571c98f5e2..fe840e34a5 100644
--- 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 80ca8ee68d..d996b34066 100644
--- 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;
}
diff --git a/lockfile.c b/lockfile.c
index 5a93bc7bc2..993bb82748 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -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;
diff --git a/wrapper.c b/wrapper.c
index c1a663fd59..ff49807948 100644
--- 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);
+}