Skip to content

Commit

Permalink
Win32: make FILETIME conversion functions public
Browse files Browse the repository at this point in the history
We will use them in the upcoming "FSCache" patches (to accelerate
sequential lstat() calls).

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
kblees authored and dscho committed Sep 24, 2024
1 parent 0c9b6a9 commit 20bfc1f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 18 deletions.
18 changes: 0 additions & 18 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -788,24 +788,6 @@ int mingw_chmod(const char *filename, int mode)
return _wchmod(wfilename, mode);
}

/*
* The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
* Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
*/
static inline long long filetime_to_hnsec(const FILETIME *ft)
{
long long winTime = ((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime;
/* Windows to Unix Epoch conversion */
return winTime - 116444736000000000LL;
}

static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
{
long long hnsec = filetime_to_hnsec(ft);
ts->tv_sec = (time_t)(hnsec / 10000000);
ts->tv_nsec = (hnsec % 10000000) * 100;
}

/**
* Verifies that safe_create_leading_directories() would succeed.
*/
Expand Down
18 changes: 18 additions & 0 deletions compat/mingw.h
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,17 @@ static inline int getrlimit(int resource, struct rlimit *rlp)
return 0;
}

/*
* The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
* Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
*/
static inline long long filetime_to_hnsec(const FILETIME *ft)
{
long long winTime = ((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime;
/* Windows to Unix Epoch conversion */
return winTime - 116444736000000000LL;
}

/*
* Use mingw specific stat()/lstat()/fstat() implementations on Windows,
* including our own struct stat with 64 bit st_size and nanosecond-precision
Expand All @@ -372,6 +383,13 @@ struct timespec {
#endif
#endif

static inline void filetime_to_timespec(const FILETIME *ft, struct timespec *ts)
{
long long hnsec = filetime_to_hnsec(ft);
ts->tv_sec = (time_t)(hnsec / 10000000);
ts->tv_nsec = (hnsec % 10000000) * 100;
}

struct mingw_stat {
_dev_t st_dev;
_ino_t st_ino;
Expand Down

0 comments on commit 20bfc1f

Please sign in to comment.