Module: Hitimes::Initialize

Defined in:
lib/hitimes/initialize.rb

Overview

Internal: Internal setup that is done when the library is loaded

We want to determine what clock to use for this machine. So we need to introspect the ruby environment and then setup some initial constants. These methods are used in lib/hitimes/instant.rb to help setup the CLOCK_ID constant at load time.

Constant Summary collapse

POTENTIAL_CLOCK_IDS =

After a fair bit of experimentaiton, it seems that the only clock_ids that are of any use are the following:

POSIX:

CLOCK_REALTIME   A settable system-wide real-time clock. Measures
                 wall-clock time. Affected by system jumps in time,
                 adjtime(3), and NTP.

CLOCK_MONOTONIC  A nonsettable system-wide clock that represent
                 monotomic time since some unspecified point in the
                 past. Not affected by jumps in system time, but is
                 affectd by adjtime(3) and NTP.

Darwin:

CLOCK_MONOTONIC_RAW  clock that increments monotonically, tracking the
                     time since an arbitrary point like CLOCK_MONOTONIC.
                     However, this clock is unaffected by frequency or
                     time adjustments.

CLOCK_UPTIME_RAW  clock that increments monotonically, in the same manner
                  as CLOCK_MONOTONIC_RAW, but that does not increment
                  while the system is asleep.  The returned value is
                  identical to the result of mach_absolute_time()
                  after the appropriate mach_timebase conversion is applied.

Linux:

CLOCK_MONOTONIC_RAW  Similar to CLOCK_MONOTONIC, but provides access to
                     a raw hardware-based time that is not subject to NTP
                     adjustments or the incremental adjustments performed
                     by adjtime(3)

CLOCK_BOOTTIME  Identical to CLOCK_MONOTONIC, except it also includes any
                time that the system is suspended.

*BSD:

All the BSDs seem to have CLOCK_MONOTONIC and CLOCK_REALTIME although on
NetBSD CLOCK_MONOTONIC is not affected by adjtime(2). It is unclear if
they are affected by adjtime(2) on FreeBSD, OpenBSD, or DragonFlyBSD. -
at least according to the man pages.

What this boils down to as that pretty much all systems have CLOCK_REALTIME and CLOCK_MONOTONIC. The other clocks are system specific and may or may not exist. We’ll try to use the most accurate clock available.

So we’ll try to use the following clocks in order of preference:

On Linux and Darwin

CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC, CLOCK_REALTIME

Everyone else:

CLOCK_MONOTONIC, CLOCK_REALTIME

So in reality, well just test for constants on all of the above and use the first one that exists.

If CLOCK_REALTIME is chose, we will dump a warning to the user. And if we can’t finde one, which is really, really odd, we’ll raise an exception.

%i[CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC CLOCK_REALTIME].freeze

Class Method Summary collapse

Class Method Details

.determine_clock_id(potential_ids = POTENTIAL_CLOCK_IDS) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/hitimes/initialize.rb', line 75

def determine_clock_id(potential_ids = POTENTIAL_CLOCK_IDS)
  sym = potential_ids.find { |id| Process.const_defined?(id) }

  unless sym
    raise Hitimes::Error, <<~ERROR
      Unable to find a high resolution clock at all. THIS IS A BUG!!

      RUBY_DESCRIPTION: #{RUBY_DESCRIPTION}

      Please report this bug to the hitimes issue tracker at
      https://github.com/copiousfreetime/hitimes/issues
    ERROR
  end

  if sym == :CLOCK_REALTIME
    warn <<~TXT
      Unable to find a high resolution clock. Using CLOCK_REALTIME for timing.

      RUBY_DESCRIPTION: #{RUBY_DESCRIPTION}

      Please report the above information to the hitimes issue tracker at
      https://github.com/copiousfreetime/hitimes/issues
    TXT
  end

  Process.const_get(sym)
end