module Fluent::Clock
def self.dst_clock_from_time(time)
def self.dst_clock_from_time(time) diff_sec = Time.now - time now_raw - diff_sec end
def self.freeze(dst = nil, &block)
def self.freeze(dst = nil, &block) return freeze_block(dst, &block) if block_given? dst = dst_clock_from_time(dst) if dst.is_a?(Time) @@frozen_clock = dst || now_raw end
def self.freeze_block(dst)
def self.freeze_block(dst) dst = dst_clock_from_time(dst) if dst.is_a?(Time) pre_frozen_clock = @@frozen_clock @@frozen_clock = dst || now_raw @@block_level += 1 yield ensure @@block_level -= 1 @@frozen_clock = pre_frozen_clock end
def self.now
def self.now @@frozen_clock || now_raw end
def self.now_raw
def self.now_raw Process.clock_gettime(CLOCK_ID) end
def self.return
def self.return raise "invalid return while running code in blocks" if @@block_level > 0 @@frozen_clock = nil end