Introduce a new function to inform the servo about upcoming leap second. This is used when the kernel leap is disabled to allow the servo to handle better the sudden 1 second step in the offset when the leap second is inserted or deleted.
Signed-off-by: Miroslav Lichvar <mlich...@redhat.com> --- clock.c | 2 ++ phc2sys.c | 2 ++ servo.c | 6 ++++++ servo.h | 8 ++++++++ servo_private.h | 2 ++ 5 files changed, 20 insertions(+) diff --git a/clock.c b/clock.c index 14e20ad..ddea72f 100644 --- a/clock.c +++ b/clock.c @@ -697,6 +697,8 @@ static int clock_utc_correct(struct clock *c, tmv_t ingress) if (c->leap_set != clock_leap) { if (c->kernel_leap) sysclk_set_leap(clock_leap); + else + servo_leap(c->servo, clock_leap); c->leap_set = clock_leap; } } diff --git a/phc2sys.c b/phc2sys.c index e063372..4b8051e 100644 --- a/phc2sys.c +++ b/phc2sys.c @@ -1114,6 +1114,8 @@ static int clock_handle_leap(struct node *node, struct clock *clock, if (clock->clkid == CLOCK_REALTIME && node->kernel_leap) sysclk_set_leap(clock_leap); + else + servo_leap(clock->servo, clock_leap); clock->leap_set = clock_leap; } } diff --git a/servo.c b/servo.c index 58bd4eb..f200f75 100644 --- a/servo.c +++ b/servo.c @@ -107,3 +107,9 @@ double servo_rate_ratio(struct servo *servo) return 1.0; } + +void servo_leap(struct servo *servo, int leap) +{ + if (servo->leap) + servo->leap(servo, leap); +} diff --git a/servo.h b/servo.h index 9cec6f4..e054501 100644 --- a/servo.h +++ b/servo.h @@ -132,4 +132,12 @@ void servo_reset(struct servo *servo); */ double servo_rate_ratio(struct servo *servo); +/** + * Inform a clock servo about upcoming leap second. + * @param servo Pointer to a servo obtained via @ref servo_create(). + * @param leap +1 when leap second will be inserted, -1 when leap second + * will be deleted, 0 when it passed. + */ +void servo_leap(struct servo *servo, int leap); + #endif diff --git a/servo_private.h b/servo_private.h index ebb7e3b..9a1a459 100644 --- a/servo_private.h +++ b/servo_private.h @@ -38,6 +38,8 @@ struct servo { void (*reset)(struct servo *servo); double (*rate_ratio)(struct servo *servo); + + void (*leap)(struct servo *servo, int leap); }; #endif -- 1.9.3 ------------------------------------------------------------------------------ HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions Find What Matters Most in Your Big Data with HPCC Systems Open Source. Fast. Scalable. Simple. Ideal for Dirty Data. Leverages Graph Analysis for Fast Processing & Easy Data Exploration http://p.sf.net/sfu/hpccsystems _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel