module Hitimes::Initialize

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

Public Class Methods

determine_clock_id() click to toggle source

Determine what clock to use for the machine we are one. We want the highest resolution clock possible, which should be nanosecond resolution.

Get the resolution of each clock id and then return the higest resolution id from the list

Returns

Returns the clock id to use on this ruby

# File lib/hitimes/initialize.rb, line 53
def determine_clock_id
  ids_and_resolutions = potential_clock_ids.map { |clock_id|
    [clock_id, Process.clock_getres(clock_id)]
  }

  # Sort them by the resolution - we want the smallest one first
  ids_and_resolutions.sort_by! { |pair| pair[1] }

  return ids_and_resolutions.first[0]
end
potential_clock_ids() click to toggle source

Return the list of clock ids, in general priority order, assuming they all have the same resolution.

On OSX we probably want to use the MACH time first, and then fall back to CLOCK_… Constants on other machines.

The one requirement is that they are monotonically increasing clocks

Returns

Returns an array of clock ids

# File lib/hitimes/initialize.rb, line 21
def potential_clock_ids
  Array.new.tap do |clock_ids|

    # if we're on OSX this will add in an additional clock_id, although not
    # sure why it is just a symbol and not a Process:: constant
    #
    begin
      Process.clock_getres(:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC)
      clock_ids << :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
    rescue Errno::EINVAL
      # not on OSX
    end

    # General monotonic constants in general order of priority assuming they
    # all have the same resolution
    #
    %i[ CLOCK_MONOTONIC_RAW CLOCK_BOOTTIME CLOCK_MONOTONIC_PRECISE CLOCK_MONOTONIC ].each do |c|
      clock_ids << Process.const_get(c) if Process.const_defined?(c)
    end

  end
end

Internal

↑ top

Private Instance Methods

determine_clock_id() click to toggle source

Determine what clock to use for the machine we are one. We want the highest resolution clock possible, which should be nanosecond resolution.

Get the resolution of each clock id and then return the higest resolution id from the list

Returns

Returns the clock id to use on this ruby

# File lib/hitimes/initialize.rb, line 53
def determine_clock_id
  ids_and_resolutions = potential_clock_ids.map { |clock_id|
    [clock_id, Process.clock_getres(clock_id)]
  }

  # Sort them by the resolution - we want the smallest one first
  ids_and_resolutions.sort_by! { |pair| pair[1] }

  return ids_and_resolutions.first[0]
end
potential_clock_ids() click to toggle source

Return the list of clock ids, in general priority order, assuming they all have the same resolution.

On OSX we probably want to use the MACH time first, and then fall back to CLOCK_… Constants on other machines.

The one requirement is that they are monotonically increasing clocks

Returns

Returns an array of clock ids

# File lib/hitimes/initialize.rb, line 21
def potential_clock_ids
  Array.new.tap do |clock_ids|

    # if we're on OSX this will add in an additional clock_id, although not
    # sure why it is just a symbol and not a Process:: constant
    #
    begin
      Process.clock_getres(:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC)
      clock_ids << :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
    rescue Errno::EINVAL
      # not on OSX
    end

    # General monotonic constants in general order of priority assuming they
    # all have the same resolution
    #
    %i[ CLOCK_MONOTONIC_RAW CLOCK_BOOTTIME CLOCK_MONOTONIC_PRECISE CLOCK_MONOTONIC ].each do |c|
      clock_ids << Process.const_get(c) if Process.const_defined?(c)
    end

  end
end