зеркало из https://github.com/microsoft/git.git
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()
This commit is contained in:
Коммит
510ab3f3c1
1
cache.h
1
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 */
|
||||
|
|
2
help.c
2
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;
|
||||
}
|
||||
|
|
31
lockfile.c
31
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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче