Use 64bit mapped time values in maptime_read when the kernel and the mapped_time_value structure in header file time_value.h support it. Otherwise step back to use the 32bit time.
--- configure.ac | 3 +++ libshouldbeinlibc/maptime.h | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/configure.ac b/configure.ac index 1f814438..d7e33e56 100644 --- a/configure.ac +++ b/configure.ac @@ -335,6 +335,9 @@ AC_SUBST([libdaemon_CFLAGS]) AC_CHECK_MEMBERS([struct thread_sched_info.last_processor],,, [#include <mach/thread_info.h>]) +AC_CHECK_MEMBERS([struct mapped_time_value.time_value.seconds],,, + [#include <mach/time_value.h>]) + PKG_CHECK_MODULES([libblkid], [blkid], [AC_DEFINE([HAVE_BLKID], [1], [Use libblkid])], [true]) diff --git a/libshouldbeinlibc/maptime.h b/libshouldbeinlibc/maptime.h index 04ce0353..3a595ae5 100644 --- a/libshouldbeinlibc/maptime.h +++ b/libshouldbeinlibc/maptime.h @@ -48,6 +48,22 @@ extern void maptime_read (volatile struct mapped_time_value *mtime, struct timev MAPTIME_EI void maptime_read (volatile struct mapped_time_value *mtime, struct timeval *tv) { +#ifdef HAVE_STRUCT_MAPPED_TIME_VALUE_TIME_VALUE_SECONDS + /* Use the 64bit time if it is supported in the kernel. Otherwise step + back to the 32bit time. */ + if (mtime->time_value.seconds != 0) + { + do + { + tv->tv_sec = mtime->time_value.seconds; + __sync_synchronize (); + tv->tv_usec = mtime->time_value.nanoseconds / 1000; + __sync_synchronize (); + } + while (tv->tv_sec != mtime->check_seconds64); + return; + } +#endif do { tv->tv_sec = mtime->seconds; -- 2.49.0