@item SOCK
Unix domain socket driver. It is similar to the SHM driver, but uses a
different format and uses a socket instead of shared memory. It does not
-require polling, the offset resolution is not limited to microseconds and it
+require polling and it
supports transmitting of PPS data. The parameter is a path to the socket which
will be created by @code{chronyd} and used to receive the messages. The format
of messages sent over the socket is described in the
* use values
* clear valid
*/
- int count;
+ volatile int count;
time_t clockTimeStampSec;
int clockTimeStampUSec;
time_t receiveTimeStampSec;
int leap;
int precision;
int nsamples;
- int valid;
- int dummy[10];
+ volatile int valid;
+ int clockTimeStampNSec;
+ int receiveTimeStampNSec;
+ int dummy[8];
};
static int shm_initialise(RCL_Instance instance) {
static int shm_poll(RCL_Instance instance)
{
- struct timeval tv1, tv2;
+ struct timeval tv;
struct shmTime t, *shm;
double offset;
shm->valid = 0;
- tv1.tv_sec = t.receiveTimeStampSec;
- tv1.tv_usec = t.receiveTimeStampUSec;
- tv2.tv_sec = t.clockTimeStampSec;
- tv2.tv_usec = t.clockTimeStampUSec;
+ tv.tv_sec = t.receiveTimeStampSec;
+ tv.tv_usec = t.receiveTimeStampUSec;
- UTI_DiffTimevalsToDouble(&offset, &tv2, &tv1);
- return RCL_AddSample(instance, &tv1, offset, t.leap);
+ offset = t.clockTimeStampSec - t.receiveTimeStampSec;
+ if (t.clockTimeStampNSec / 1000 == t.clockTimeStampUSec &&
+ t.receiveTimeStampNSec / 1000 == t.receiveTimeStampUSec)
+ offset += (t.clockTimeStampNSec - t.receiveTimeStampNSec) * 1e-9;
+ else
+ offset += (t.clockTimeStampUSec - t.receiveTimeStampUSec) * 1e-6;
+
+ return RCL_AddSample(instance, &tv, offset, t.leap);
}
RefclockDriver RCL_SHM_driver = {