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