summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Rosdahl <joel@rosdahl.net>2022-08-04 20:01:40 +0200
committerJoel Rosdahl <joel@rosdahl.net>2022-08-20 14:17:37 +0200
commit0067832fa6c7b190fc1e806f1cff6f4941a2270d (patch)
treef6aef707ed0f70d4ab73fb6f6ca5d705c20c70f6
parent132c10c97394c28d82dcc572cac495832f8f38a9 (diff)
downloadccache-0067832fa6c7b190fc1e806f1cff6f4941a2270d.tar.gz
enhance: Support Stat::{atim,ctim,mtim} on macOS
(cherry picked from commit bcdaeb5c6082717bac984ab2ffafd0bdee552458)
-rw-r--r--cmake/GenerateConfigurationFile.cmake6
-rw-r--r--cmake/config.h.in9
-rw-r--r--src/InodeCache.cpp18
-rw-r--r--src/Stat.hpp6
-rw-r--r--unittest/test_Stat.cpp6
5 files changed, 28 insertions, 17 deletions
diff --git a/cmake/GenerateConfigurationFile.cmake b/cmake/GenerateConfigurationFile.cmake
index 5d106ff9..8e2c2202 100644
--- a/cmake/GenerateConfigurationFile.cmake
+++ b/cmake/GenerateConfigurationFile.cmake
@@ -68,6 +68,12 @@ check_struct_has_member("struct stat" st_ctim sys/stat.h
HAVE_STRUCT_STAT_ST_CTIM LANGUAGE CXX)
check_struct_has_member("struct stat" st_mtim sys/stat.h
HAVE_STRUCT_STAT_ST_MTIM LANGUAGE CXX)
+check_struct_has_member("struct stat" st_atimespec sys/stat.h
+ HAVE_STRUCT_STAT_ST_ATIMESPEC LANGUAGE CXX)
+check_struct_has_member("struct stat" st_ctimespec sys/stat.h
+ HAVE_STRUCT_STAT_ST_CTIMESPEC LANGUAGE CXX)
+check_struct_has_member("struct stat" st_mtimespec sys/stat.h
+ HAVE_STRUCT_STAT_ST_MTIMESPEC LANGUAGE CXX)
check_struct_has_member("struct statfs" f_fstypename sys/mount.h
HAVE_STRUCT_STATFS_F_FSTYPENAME LANGUAGE CXX)
diff --git a/cmake/config.h.in b/cmake/config.h.in
index e5cd5e7b..f575c53f 100644
--- a/cmake/config.h.in
+++ b/cmake/config.h.in
@@ -124,6 +124,15 @@
// Define if "st_mtim" is a member of "struct stat".
#cmakedefine HAVE_STRUCT_STAT_ST_MTIM
+// Define if "st_atimespec" is a member of "struct stat".
+#cmakedefine HAVE_STRUCT_STAT_ST_ATIMESPEC
+
+// Define if "st_ctimespec" is a member of "struct stat".
+#cmakedefine HAVE_STRUCT_STAT_ST_CTIMESPEC
+
+// Define if "st_mtimespec" is a member of "struct stat".
+#cmakedefine HAVE_STRUCT_STAT_ST_MTIMESPEC
+
// Define if you have the "syslog" function.
#cmakedefine HAVE_SYSLOG
diff --git a/src/InodeCache.cpp b/src/InodeCache.cpp
index 15a33928..db411c35 100644
--- a/src/InodeCache.cpp
+++ b/src/InodeCache.cpp
@@ -90,17 +90,9 @@ struct InodeCache::Key
dev_t st_dev;
ino_t st_ino;
mode_t st_mode;
-#ifdef HAVE_STRUCT_STAT_ST_MTIM
timespec st_mtim;
-#else
- time_t st_mtim;
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_CTIM
timespec st_ctim; // Included for sanity checking.
-#else
- time_t st_ctim; // Included for sanity checking.
-#endif
- off_t st_size; // Included for sanity checking.
+ off_t st_size; // Included for sanity checking.
bool sloppy_time_macros;
};
@@ -188,16 +180,8 @@ InodeCache::hash_inode(const std::string& path,
key.st_dev = stat.device();
key.st_ino = stat.inode();
key.st_mode = stat.mode();
-#ifdef HAVE_STRUCT_STAT_ST_MTIM
key.st_mtim = stat.mtim();
-#else
- key.st_mtim = stat.mtime();
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_CTIM
key.st_ctim = stat.ctim();
-#else
- key.st_ctim = stat.ctime();
-#endif
key.st_size = stat.size();
Hash hash;
diff --git a/src/Stat.hpp b/src/Stat.hpp
index 53aed648..e31a6b13 100644
--- a/src/Stat.hpp
+++ b/src/Stat.hpp
@@ -270,6 +270,8 @@ Stat::atim() const
{
#if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_ATIM)
return m_stat.st_atim;
+#elif defined(HAVE_STRUCT_STAT_ST_ATIMESPEC)
+ return m_stat.st_atimespec;
#else
return {m_stat.st_atime, 0};
#endif
@@ -280,6 +282,8 @@ Stat::ctim() const
{
#if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_CTIM)
return m_stat.st_ctim;
+#elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC)
+ return m_stat.st_ctimespec;
#else
return {m_stat.st_ctime, 0};
#endif
@@ -290,6 +294,8 @@ Stat::mtim() const
{
#if defined(_WIN32) || defined(HAVE_STRUCT_STAT_ST_MTIM)
return m_stat.st_mtim;
+#elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC)
+ return m_stat.st_mtimespec;
#else
return {m_stat.st_mtime, 0};
#endif
diff --git a/unittest/test_Stat.cpp b/unittest/test_Stat.cpp
index 3a3586e2..a6e41b33 100644
--- a/unittest/test_Stat.cpp
+++ b/unittest/test_Stat.cpp
@@ -284,6 +284,9 @@ TEST_CASE("Return values when file exists")
# ifdef HAVE_STRUCT_STAT_ST_CTIM
CHECK(stat.ctim().tv_sec == st.st_ctim.tv_sec);
CHECK(stat.ctim().tv_nsec == st.st_ctim.tv_nsec);
+# elif defined(HAVE_STRUCT_STAT_ST_CTIMESPEC)
+ CHECK(stat.ctim().tv_sec == st.st_ctimespec.tv_sec);
+ CHECK(stat.ctim().tv_nsec == st.st_ctimespec.tv_nsec);
# else
CHECK(stat.ctim().tv_sec == st.st_ctime);
CHECK(stat.ctim().tv_nsec == 0);
@@ -292,6 +295,9 @@ TEST_CASE("Return values when file exists")
# ifdef HAVE_STRUCT_STAT_ST_MTIM
CHECK(stat.mtim().tv_sec == st.st_mtim.tv_sec);
CHECK(stat.mtim().tv_nsec == st.st_mtim.tv_nsec);
+# elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC)
+ CHECK(stat.mtim().tv_sec == st.st_mtimespec.tv_sec);
+ CHECK(stat.mtim().tv_nsec == st.st_mtimespec.tv_nsec);
# else
CHECK(stat.mtim().tv_sec == st.st_mtime);
CHECK(stat.mtim().tv_nsec == 0);