lockfile: convert retry timeout computations to millisecond
When the goal is to wait for some random amount of time up to one second, it is not necessary to compute with microsecond precision. This is a preparation to re-use sleep_millisec(). Signed-off-by: Johannes Sixt <j6t@kdbg.org> Reviewed-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
2024d31765
commit
a8a17756bb
21
lockfile.c
21
lockfile.c
@ -184,7 +184,7 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
|
|||||||
{
|
{
|
||||||
int n = 1;
|
int n = 1;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
long remaining_us = 0;
|
long remaining_ms = 0;
|
||||||
static int random_initialized = 0;
|
static int random_initialized = 0;
|
||||||
|
|
||||||
if (timeout_ms == 0)
|
if (timeout_ms == 0)
|
||||||
@ -195,16 +195,11 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
|
|||||||
random_initialized = 1;
|
random_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeout_ms > 0) {
|
if (timeout_ms > 0)
|
||||||
/* avoid overflow */
|
remaining_ms = timeout_ms;
|
||||||
if (timeout_ms <= LONG_MAX / 1000)
|
|
||||||
remaining_us = timeout_ms * 1000;
|
|
||||||
else
|
|
||||||
remaining_us = LONG_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
long backoff_ms, wait_us;
|
long backoff_ms, wait_ms;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = lock_file(lk, path, flags);
|
fd = lock_file(lk, path, flags);
|
||||||
@ -213,14 +208,14 @@ static int lock_file_timeout(struct lock_file *lk, const char *path,
|
|||||||
return fd; /* success */
|
return fd; /* success */
|
||||||
else if (errno != EEXIST)
|
else if (errno != EEXIST)
|
||||||
return -1; /* failure other than lock held */
|
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 */
|
return -1; /* failure due to timeout */
|
||||||
|
|
||||||
backoff_ms = multiplier * INITIAL_BACKOFF_MS;
|
backoff_ms = multiplier * INITIAL_BACKOFF_MS;
|
||||||
/* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
|
/* back off for between 0.75*backoff_ms and 1.25*backoff_ms */
|
||||||
wait_us = (750 + rand() % 500) * backoff_ms;
|
wait_ms = (750 + rand() % 500) * backoff_ms / 1000;
|
||||||
sleep_microseconds(wait_us);
|
sleep_microseconds(wait_ms*1000);
|
||||||
remaining_us -= wait_us;
|
remaining_ms -= wait_ms;
|
||||||
|
|
||||||
/* Recursion: (n+1)^2 = n^2 + 2n + 1 */
|
/* Recursion: (n+1)^2 = n^2 + 2n + 1 */
|
||||||
multiplier += 2*n + 1;
|
multiplier += 2*n + 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user