Could anyone please review and test the patch on macOS? I hope it is merged
to 1.7-stable.

Jun Omae <jun6...@gmail.com> (大前 潤)


On Sun, Jan 7, 2024 at 13:46 Jun Omae <jun6...@gmail.com> wrote:

> Hi,
>
> I noticed that apr_stat() on macOS gives only a resolution of seconds for
> mtime/ctime/atime while running tests of Subversion on macOS. However,
> according to man page of stat(2) [1], it provides a resolution of
> nanoseconds
> for mtime/ctime/atime.
>
> [[[
> Process 62313 launched: '/tmp/stat' (x86_64)
> Process 62313 stopped
> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
>     frame #0: 0x0000000100003e65 stat`main(argc=1, argv=<unavailable>) at
> stat.c:14:9 [opt]
>    11           apr_finfo_t finfo;
>    12           stat(filename, &statbuf);
>    13           apr_stat(&finfo, filename, 0, NULL);
> -> 14           printf("%s:\n", filename);
>    15           printf("         %19s  %20s\n", "apr_stat", "stat");
>    16           printf("  mtime: %19lld  %10lld.%09ld\n",
>    17                  (int64_t) finfo.mtime,
> Target 0: (stat) stopped.
> warning: stat was compiled with optimization - stepping may behave oddly;
> variables may not be available.
> (lldb) p finfo.mtime
> (apr_time_t) 1704523440000000
> (lldb) p statbuf.st_mtimespec
> (timespec)  (tv_sec = 1704523440, tv_nsec = 172445899)
> ]]]
>
> I think we could check `struct stat.st_{m,c,a}timespec.tv_nsec` in the
> configure script.
>
> [1]
> https://man.freebsd.org/cgi/man.cgi?query=stat&sektion=2&apropos=0&manpath=macOS+10.13.6#DESCRIPTION
>
>
> Proposed patch:
>
> [[[
> Support microseconds of mtime/atime/ctime in apr_stat() on macOS.
>
> * configure.in
>   (Checking for File Info Support): Add struct stat.st_atimespec.tv_nsec,
>   struct stat.st_mtimespec.tv_nsec, struct stat.st_ctimespec.tv_nsec.
> * file_io/unix/filestat.c
>   (fill_out_finfo): Use st_mtimespec.tv_nsec, st_atimensec.tv_nsec and
>   st_ctimensec.tv_nsec if available.
>
>
> Index: configure.in
> ===================================================================
> --- configure.in        (revision 1915079)
> +++ configure.in        (working copy)
> @@ -2876,7 +2876,9 @@ AC_MSG_NOTICE([Checking for File Info Support...])
>  AC_CHECK_MEMBERS([struct stat.st_blocks, struct stat.st_atimensec,
>  struct stat.st_ctimensec, struct stat.st_mtimensec, struct
> stat.st_atim.tv_nsec,
>  struct stat.st_ctim.tv_nsec, struct stat.st_mtim.tv_nsec,
> -struct stat.st_atime_n, struct stat.st_ctime_n, struct
> stat.st_mtime_n],,,[
> +struct stat.st_atime_n, struct stat.st_ctime_n, struct stat.st_mtime_n,
> +struct stat.st_atimespec.tv_nsec, struct stat.st_mtimespec.tv_nsec,
> +struct stat.st_ctimespec.tv_nsec],,,[
>  #ifdef HAVE_SYS_TYPES_H
>  #include <sys/types.h>
>  #endif
> Index: file_io/unix/filestat.c
> ===================================================================
> --- file_io/unix/filestat.c     (revision 1915079)
> +++ file_io/unix/filestat.c     (working copy)
> @@ -96,6 +96,8 @@ static void fill_out_finfo(apr_finfo_t *finfo, str
>      finfo->atime += info->st_atimensec / APR_TIME_C(1000);
>  #elif defined(HAVE_STRUCT_STAT_ST_ATIME_N)
>      finfo->atime += info->st_atime_n / APR_TIME_C(1000);
> +#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC)
> +    finfo->atime += info->st_atimespec.tv_nsec / APR_TIME_C(1000);
>  #endif
>
>      apr_time_ansi_put(&finfo->mtime, info->st_mtime);
> @@ -105,6 +107,8 @@ static void fill_out_finfo(apr_finfo_t *finfo, str
>      finfo->mtime += info->st_mtimensec / APR_TIME_C(1000);
>  #elif defined(HAVE_STRUCT_STAT_ST_MTIME_N)
>      finfo->mtime += info->st_mtime_n / APR_TIME_C(1000);
> +#elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
> +    finfo->mtime += info->st_mtimespec.tv_nsec / APR_TIME_C(1000);
>  #endif
>
>      apr_time_ansi_put(&finfo->ctime, info->st_ctime);
> @@ -114,6 +118,8 @@ static void fill_out_finfo(apr_finfo_t *finfo, str
>      finfo->ctime += info->st_ctimensec / APR_TIME_C(1000);
>  #elif defined(HAVE_STRUCT_STAT_ST_CTIME_N)
>      finfo->ctime += info->st_ctime_n / APR_TIME_C(1000);
> +#elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC_TV_NSEC)
> +    finfo->ctime += info->st_ctimespec.tv_nsec / APR_TIME_C(1000);
>  #endif
>
>  #ifdef HAVE_STRUCT_STAT_ST_BLOCKS
> ]]]
>
> --
> Jun Omae <jun6...@gmail.com> (大前 潤)
>

Reply via email to