<div dir="ltr">The length of the SHM construct appears to date back to 1997 at that<br>time according to Wikipedia only four processor architectures had<br>64-bit address spaces. I have no information on the prevalence of<br>64-bit processors. However, I think it is reasonable to assume that<br>the integers of that time defaulted to 32 bits, as did time_t.<br>resulting in an SHM struct that used 40 bytes of data and had another<br>40 unused, revised to a 48/32 split when nanoseconds were added.<br><br>I would like to propose a new SHM implementation that uses 12-byte<br>timestamps, a uint32_t for each of NTP epoch, seconds into epoch and<br>gammaseconds. Furthermore, I would like to suggest a trio of timestamp<br>pairs. resulting in 72 bits of horological mediocrity and 4 bytes as<br>a new header, 8 bytes as an optional pointer to another SHM segment<br>and 12 bytes for a text field that could be returned for ntpq like<br>queries to the receiving implementation.<br><br>given that SHM seems to throw around 4KiB pages. an implementation<br>where 32 128-byte subpackets should be possible. That would allow a<br>four-byte field for refid, a greatly expanded text field, or possibly<br>64-bit second fragments.<br><br>   [00] uint_8 mode<br>   [01] uint_8 leap<br>   [02] uint_8 board validity<br>   [03] uint_8 precision<br>[04-11] u64_p next_shim_segment<br>[12-23] l_fp2 a_refclockstamp<br>[24-35] l_fp2 a_sysclockstamp<br>[36-47] l_fp2 b_refclockstamp<br>[48-59] l_fp2 b_sysclockstamp<br>[60-71] l_fp2 c_refclockstamp<br>[72-83] l_fp2 c_sysclockstamp<br>[84-95] char[12] freee text<br><br>-- or --<br><br>    [000] uint_8 mode<br>    [001] uint_8 leap<br>    [002] uint_8 valid board<br>    [003] uint_8 precision<br>[004-015] l_fp2 a_refclockstamp<br>[016-027] l_fp2 a_sysclockstamp<br>[028-039] l_fp2 b_refclockstamp<br>[040-051] l_fp2 b_sysclockstamp<br>[052-063] l_fp2 c_refclockstamp<br>[064-075] l_fp2 c_sysclockstamp<br>[076-124] char[48] free text<br>[124-127] char[4] refid<br><br>board valid values (all other values reserved)<br>0x00 board SHM uninitialized<br>0x01 board a valid (writing board b)<br>0x01 board b valid (writing board c)<br>0x01 board c valid (writing board a)<br>0x81 board a valid (going to write board b)<br>0x82 board b valid (going to write board c)<br>0x83 board c valid (going to write board a)<br><br>leap and precision values as per ntpv4<br>mode (0 and 1 as per current implementation,<br>      2 = Garys read-only mode,<br>      3 = whatever this becomes,<br>      4+ reserved for future expansion)<br><br>The first process to access SHM should allocate and if necessary zero<br>it out. refclocks should the first open segment write all the header<br>fields except valid, then plant timestamps in board A, finally, it<br>should write the octet 0x81 in the valid field.<br><br>Subsequent writes might involve, unsetting the high bit, writing the<br>new timestamps to the next board in rotation and finally, writing the<br>new octet to the valid field.<br></div>