[chrony-dev] [PATCH 2/2] refclock: Fix poll counting for refclocks that do polling and event driven timekeeping

[ Thread Index | Date Index | More chrony.tuxfamily.org/chrony-dev Archives ]


The RTC refclock support both modes of timekeeping (depending on
hardware capabilities). As the driver data is const there is a poll
callback even in interrupt mode.

So only count poll calls that return non-zero and count provided
timestamps in the respecitve functions if they are not called from the
driver's poll routine.
---
Hello,

I'm a bit unsure about this change. I wonder what driver_polled actually
should count. If it counts the number off poll calls the logic in
RCL_AddCookedPulse and RCL_AddSample are unreliable as they only count
the events that actually yielded a timestamp?!

Best regards
Uwe

 refclock.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/refclock.c b/refclock.c
index a95f7fd59902..95d3abad4791 100644
--- a/refclock.c
+++ b/refclock.c
@@ -79,6 +79,7 @@ struct RCL_Instance_Record {
   int driver_poll;
   int driver_polled;
   int poll;
+  int inpoll;
   int leap_status;
   int pps_forced;
   int pps_rate;
@@ -191,6 +192,7 @@ RCL_AddRefclock(RefclockParameters *params)
   inst->driver_parameter_length = 0;
   inst->driver_poll = params->driver_poll;
   inst->poll = params->poll;
+  inst->inpoll = 0;
   inst->driver_polled = 0;
   inst->leap_status = LEAP_Normal;
   inst->pps_forced = params->pps_forced;
@@ -485,7 +487,7 @@ RCL_AddSample(RCL_Instance instance, struct timespec *sample_time, double offset
   log_sample(instance, &cooked_time, 0, 0, offset, offset - correction + instance->offset, dispersion);
 
   /* for logging purposes */
-  if (!instance->driver->poll)
+  if (!instance->inpoll)
     instance->driver_polled++;
 
   return 1;
@@ -631,7 +633,7 @@ RCL_AddCookedPulse(RCL_Instance instance, struct timespec *cooked_time,
              offset, dispersion);
 
   /* for logging purposes */
-  if (!instance->driver->poll)
+  if (!instance->inpoll)
     instance->driver_polled++;
 
   return 1;
@@ -710,9 +712,13 @@ poll_timeout(void *arg)
   poll = inst->poll;
 
   if (inst->driver->poll) {
+    int ret;
     poll = inst->driver_poll;
-    inst->driver->poll(inst);
-    inst->driver_polled++;
+    inst->inpoll = 1;
+    ret = inst->driver->poll(inst);
+    inst->inpoll = 0;
+    if (ret)
+      inst->driver_polled++;
   }
   
   if (!(inst->driver->poll && inst->driver_polled < (1 << (inst->poll - inst->driver_poll)))) {
-- 
2.30.2


-- 
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.


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/