aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/tools/filetime.cpp
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-03-06 17:28:14 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2017-03-08 11:47:56 +0000
commite760693b84bc88eba78b1d3e08899ad6b5c80ac5 (patch)
tree0e96f53585778d0ba9b852023acc9f1e59f1b118 /src/lib/corelib/tools/filetime.cpp
parentad96a388f7e31cf7b8260de7631319e5c76613ec (diff)
Handle sub-second timestamps correctly on Unix
There are file systems that support a more fine-grained resolution than the traditional second. [ChangeLog] Sub-second timestamp resolutions are now supported on Unix systems. Task-number: QBS-1110 Change-Id: I7c819882497511462d868584eb059ac392b155d9 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib/corelib/tools/filetime.cpp')
-rw-r--r--src/lib/corelib/tools/filetime.cpp72
1 files changed, 62 insertions, 10 deletions
diff --git a/src/lib/corelib/tools/filetime.cpp b/src/lib/corelib/tools/filetime.cpp
index ac917260e..794548f27 100644
--- a/src/lib/corelib/tools/filetime.cpp
+++ b/src/lib/corelib/tools/filetime.cpp
@@ -45,7 +45,6 @@
#include <QtCore/qt_windows.h>
#else
#include <QtCore/qdatetime.h>
-#include <time.h>
#endif
namespace qbs {
@@ -57,33 +56,55 @@ template<> struct CompileTimeAssert<true> {};
#endif
FileTime::FileTime()
- : m_fileTime(0)
{
#ifdef Q_OS_WIN
static CompileTimeAssert<sizeof(FileTime::InternalType) == sizeof(FILETIME)> internal_type_has_wrong_size;
Q_UNUSED(internal_type_has_wrong_size);
+ m_fileTime = 0;
+#else
+ m_fileTime = {0, 0};
#endif
}
-bool FileTime::operator < (const FileTime &rhs) const
+FileTime::FileTime(const FileTime::InternalType &ft) : m_fileTime(ft)
+{
+#ifndef Q_OS_WIN
+ if (m_fileTime.tv_sec == 0)
+ m_fileTime.tv_nsec = 0; // stat() sets only the first member to 0 for non-existing files.
+#endif
+}
+
+int FileTime::compare(const FileTime &other) const
{
#ifdef Q_OS_WIN
const FILETIME *const t1 = reinterpret_cast<const FILETIME *>(&m_fileTime);
- const FILETIME *const t2 = reinterpret_cast<const FILETIME *>(&rhs.m_fileTime);
- return CompareFileTime(t1, t2) < 0;
+ const FILETIME *const t2 = reinterpret_cast<const FILETIME *>(&other.m_fileTime);
+ return CompareFileTime(t1, t2);
#else
- return m_fileTime < rhs.m_fileTime;
+ if (m_fileTime.tv_sec < other.m_fileTime.tv_sec)
+ return -1;
+ if (m_fileTime.tv_sec > other.m_fileTime.tv_sec)
+ return 1;
+ if (m_fileTime.tv_nsec < other.m_fileTime.tv_nsec)
+ return -1;
+ if (m_fileTime.tv_nsec > other.m_fileTime.tv_nsec)
+ return 1;
+ return 0;
#endif
}
void FileTime::clear()
{
+#ifdef Q_OS_WIN
m_fileTime = 0;
+#else
+ m_fileTime = { 0, 0 };
+#endif
}
bool FileTime::isValid() const
{
- return m_fileTime != 0;
+ return *this != FileTime();
}
FileTime FileTime::currentTime()
@@ -96,7 +117,9 @@ FileTime FileTime::currentTime()
SystemTimeToFileTime(&st, ft);
return result;
#else
- return time(0);
+ InternalType t;
+ clock_gettime(CLOCK_REALTIME, &t);
+ return t;
#endif
}
@@ -118,7 +141,16 @@ FileTime FileTime::oldestTime()
SystemTimeToFileTime(&st, ft);
return result;
#else
- return 1;
+ return FileTime({1, 0});
+#endif
+}
+
+double FileTime::asDouble() const
+{
+#ifdef Q_OS_WIN
+ return static_cast<double>(m_fileTime);
+#else
+ return static_cast<double>(m_fileTime.tv_sec);
#endif
}
@@ -135,10 +167,30 @@ QString FileTime::toString() const
return result;
#else
QDateTime dt;
- dt.setTime_t(m_fileTime);
+ dt.setMSecsSinceEpoch(m_fileTime.tv_sec * 1000 + m_fileTime.tv_nsec / 1000000);
return dt.toString();
#endif
}
+void qbs::Internal::FileTime::store(PersistentPool &pool) const
+{
+#ifdef Q_OS_WIN
+ pool.store(static_cast<quint64>(m_fileTime));
+#else
+ pool.store(static_cast<qint64>(m_fileTime.tv_sec));
+ pool.store(static_cast<qint64>(m_fileTime.tv_nsec));
+#endif
+}
+
+void qbs::Internal::FileTime::load(PersistentPool &pool)
+{
+#ifdef Q_OS_WIN
+ m_fileTime = pool.load<quint64>();
+#else
+ m_fileTime.tv_sec = pool.load<qint64>();
+ m_fileTime.tv_nsec = pool.load<qint64>();
+#endif
+}
+
} // namespace Internal
} // namespace qbs