[chrony-dev] [PATCH] Mac OS X - Version 2 - Synchronise RTC from system time |
[ Thread Index |
Date Index
| More chrony.tuxfamily.org/chrony-dev Archives
]
- To: chrony-dev@xxxxxxxxxxxxxxxxxxxx
- Subject: [chrony-dev] [PATCH] Mac OS X - Version 2 - Synchronise RTC from system time
- From: Bryan Christianson <bryan@xxxxxxxxxxxxx>
- Date: Fri, 4 Dec 2015 00:15:49 +1300
- Cc: Bryan Christianson <bryan@xxxxxxxxxxxxx>
- Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpcorp.com; s=a0-2; h=Feedback-ID:X-Smtpcorp-Track:Message-Id:Date: Subject:To:From; bh=pujemgfEPllIgUjEENLamuNjy5KkYHpyDkuf20nuR1U=; b=gqXBbVS3k fxZxeHfyEyCH1WbuqcgWW93fs4XqRjxSD33xMpHBRRVHljn8djv0pHsoKbvCkna8Wc8Kj4YgYV9T9 2+cisQOmhpt77YFIGzRtaIfo7cpm1QxwmipgDTtp3j4RV+QHSVQWTXmvtOOvTVpBxwskGxdXBQiO6 INigmtWuMHiGWWMFvyeT24TFOA+SR0E93VeUJK3kOOla34vODqM+n+Gl9RRp9dJFtzuTx6+YPo+tH a8Uike+FJSWr0hUxEWr3PVu0g0+Yt4r382YzpLrPmRD9MPiru/wc26jfid2YUx5x0rqV6hnhBEUQ/ x0c+mO8pG823zDX7Vzfan4bdQ==;
- Feedback-id: 149811m:149811acx33YQ:149811s_8BctJog6:SMTPCORP
When the rtcsync directive is specified in the chronyd config file,
chronyd will update the RTC via settimeofday() every 60 minutes if
the system time is synchronised to NTP.
Version 2 changes
1. Fix typos in commit message and documentation
2. Remove redundant gettimeofday(...)
3. Use SCH_GetLastEventTime(...) in lieu of gettimeofday(...)
4. Compare absolute elapsed time since last rtc sync.
---
chrony.texi.in | 15 ++++++++++-----
sys_macosx.c | 25 ++++++++++++++++++++++++-
2 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/chrony.texi.in b/chrony.texi.in
index 4bb212a..532d8f1 100644
--- a/chrony.texi.in
+++ b/chrony.texi.in
@@ -2844,12 +2844,17 @@ Note that this setting is overriden when the @code{hwclockfile} directive
@node rtcsync directive
@subsection rtcsync
-The @code{rtcsync} directive will enable a kernel mode where the
-system time is copied to the real time clock (RTC) every 11 minutes.
+The @code{rtcsync} directive enables a mode where the system time is
+periodically copied to the real time clock (RTC).
-This directive is supported only on Linux and cannot be used when the
-normal RTC tracking is enabled, i.e. when the @code{rtcfile} directive
-is used. On other systems this directive does nothing.
+On Linux the RTC copy is performed by the kernel every 11 minutes. This
+directive cannot be used when the normal RTC tracking is enabled,
+i.e. when the @code{rtcfile} directive is used.
+
+On Mac OS X, chronyd will perform the RTC copy every 60 minutes when the
+system clock is in a synchronised state.
+
+On other systems this directive does nothing.
@c }}}
@c {{{ sched_priority
@node sched_priority directive
diff --git a/sys_macosx.c b/sys_macosx.c
index 36981ba..6335e36 100644
--- a/sys_macosx.c
+++ b/sys_macosx.c
@@ -38,6 +38,7 @@
#include <pthread.h>
#include "sys_macosx.h"
+#include "conf.h"
#include "localp.h"
#include "logging.h"
#include "sched.h"
@@ -88,6 +89,11 @@ static struct timeval Tdrift;
#define NANOS_PER_MSEC (1000000ULL)
+/* RTC synchronisation - once an hour */
+
+static struct timeval last_rtc_sync;
+#define RTC_SYNC_INTERVAL (60 * 60.0)
+
/* ================================================== */
static void
@@ -105,6 +111,7 @@ clock_initialise(void)
LOG_FATAL(LOGF_SysMacOSX, "gettimeofday() failed");
}
Tdrift = T0;
+ last_rtc_sync = T0;
newadj.tv_sec = 0;
newadj.tv_usec = 0;
@@ -317,7 +324,9 @@ drift_removal_timeout(SCH_ArbitraryArgument not_used)
/* ================================================== */
-/* use est_error to calculate the drift_removal_interval */
+/* use est_error to calculate the drift_removal_interval and
+ update the RTC
+*/
static void
set_sync_status(int synchronised, double est_error, double max_error)
@@ -327,6 +336,20 @@ set_sync_status(int synchronised, double est_error, double max_error)
if (!synchronised) {
drift_removal_interval = MAX(drift_removal_interval, DRIFT_REMOVAL_INTERVAL);
} else {
+ if (CNF_GetRtcSync()) {
+ struct timeval now;
+ double rtc_sync_elapsed;
+
+ SCH_GetLastEventTime(NULL, NULL, &now);
+ UTI_DiffTimevalsToDouble(&rtc_sync_elapsed, &now, &last_rtc_sync);
+ if (fabs(rtc_sync_elapsed) >= RTC_SYNC_INTERVAL) {
+ /* update the RTC by applying a step of 0.0 secs */
+ apply_step_offset(0.0);
+ last_rtc_sync = now;
+ DEBUG_LOG(LOGF_SysMacOSX, "rtc synchronised");
+ }
+ }
+
interval = ERROR_WEIGHT * est_error / (fabs(current_freq) + FREQUENCY_RES);
drift_removal_interval = MAX(interval, DRIFT_REMOVAL_INTERVAL_MIN);
--
2.4.9 (Apple Git-60)
--
To unsubscribe email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "unsubscribe" in the subject.
For help email chrony-dev-request@xxxxxxxxxxxxxxxxxxxx with "help" in the subject.
Trouble? Email listmaster@xxxxxxxxxxxxxxxxxxxx.