timestamp_t: a new data type for timestamps

Git's source code assumes that unsigned long is at least as precise as
time_t. Which is incorrect, and causes a lot of problems, in particular
where unsigned long is only 32-bit (notably on Windows, even in 64-bit
versions).

So let's just use a more appropriate data type instead. In preparation
for this, we introduce the new `timestamp_t` data type.

By necessity, this is a very, very large patch, as it has to replace all
timestamps' data type in one go.

As we will use a data type that is not necessarily identical to `time_t`,
we need to be very careful to use `time_t` whenever we interact with the
system functions, and `timestamp_t` everywhere else.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin
2017-04-26 21:29:31 +02:00
committed by Junio C Hamano
parent cb71f8bdb5
commit dddbad728c
49 changed files with 170 additions and 158 deletions

View File

@ -8,7 +8,7 @@ static struct tempfile socket_file;
struct credential_cache_entry {
struct credential item;
unsigned long expiration;
timestamp_t expiration;
};
static struct credential_cache_entry *entries;
static int entries_nr;
@ -47,12 +47,12 @@ static void remove_credential(const struct credential *c)
e->expiration = 0;
}
static int check_expirations(void)
static timestamp_t check_expirations(void)
{
static unsigned long wait_for_entry_until;
static timestamp_t wait_for_entry_until;
int i = 0;
unsigned long now = time(NULL);
unsigned long next = (unsigned long)-1;
timestamp_t now = time(NULL);
timestamp_t next = TIME_MAX;
/*
* Initially give the client 30 seconds to actually contact us
@ -159,7 +159,7 @@ static void serve_one_client(FILE *in, FILE *out)
static int serve_cache_loop(int fd)
{
struct pollfd pfd;
unsigned long wakeup;
timestamp_t wakeup;
wakeup = check_expirations();
if (!wakeup)