]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: schedule time and timezone change events a bit before .timer elapsation events
authorLennart Poettering <lennart@poettering.net>
Tue, 29 May 2018 14:26:24 +0000 (16:26 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 6 Jun 2018 08:55:45 +0000 (10:55 +0200)
We really should make sure that .timer units are dispatched while taking
the newest time/timezone data into account.

src/core/manager.c

index d2f628d2bb30db0479e17641f6f932e6945b98a0..7fc31ce5693aee964e7f8aab89e0122f1c7b5407 100644 (file)
@@ -369,6 +369,11 @@ static int manager_setup_time_change(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Failed to create time change event source: %m");
 
+        /* Schedule this slightly earlier than the .timer event sources */
+        r = sd_event_source_set_priority(m->time_change_event_source, SD_EVENT_PRIORITY_NORMAL-1);
+        if (r < 0)
+                return log_error_errno(r, "Failed to set priority of time change event sources: %m");
+
         (void) sd_event_source_set_description(m->time_change_event_source, "manager-time-change");
 
         log_debug("Set up TFD_TIMER_CANCEL_ON_SET timerfd.");
@@ -401,7 +406,7 @@ static int manager_read_timezone_stat(Manager *m) {
 }
 
 static int manager_setup_timezone_change(Manager *m) {
-        sd_event_source *new_event = NULL;
+        _cleanup_(sd_event_source_unrefp) sd_event_source *new_event = NULL;
         int r;
 
         assert(m);
@@ -429,8 +434,13 @@ static int manager_setup_timezone_change(Manager *m) {
         if (r < 0)
                 return log_error_errno(r, "Failed to create timezone change event source: %m");
 
+        /* Schedule this slightly earlier than the .timer event sources */
+        r = sd_event_source_set_priority(new_event, SD_EVENT_PRIORITY_NORMAL-1);
+        if (r < 0)
+                return log_error_errno(r, "Failed to set priority of timezone change event sources: %m");
+
         sd_event_source_unref(m->timezone_change_event_source);
-        m->timezone_change_event_source = new_event;
+        m->timezone_change_event_source = TAKE_PTR(new_event);
 
         return 0;
 }