#
# Copyright(c) Anders Bengtsson 2003
#
require 'madeleine'
module Madeleine
module Clock
# Deprecated. Use SnapshotMadeleine instead.
class ClockedSnapshotMadeleine < ::Madeleine::SnapshotMadeleine # :nodoc:
end
# Let your system extend this module if you need to access the
# machine time. Used together with a TimeActor that keeps
# the clock current.
module ClockedSystem
# Returns this system's Clock.
def clock
unless defined? @clock
@clock = Clock.new
end
@clock
end
end
# Sends clock ticks to update a ClockedSystem, so that time can be
# dealt with in a deterministic way.
class TimeActor
# Create and launch a new TimeActor
#
# * madeleine - The SnapshotMadeleine instance to work on.
# * delay - Delay between ticks in seconds (Optional).
def self.launch(madeleine, delay=0.1)
result = new(madeleine, delay)
result
end
# Stops the TimeActor.
def destroy
@is_destroyed = true
@thread.wakeup
@thread.join
end
private_class_method :new
private
def initialize(madeleine, delay) #:nodoc:
@madeleine = madeleine
@is_destroyed = false
send_tick
@thread = Thread.new {
until @is_destroyed
sleep(delay)
send_tick
end
}
end
def send_tick
@madeleine.execute_command(Tick.new(Time.now))
end
end
# Keeps track of time in a ClockedSystem.
class Clock
# Returns the system's time as a Ruby Time.
attr_reader :time
def initialize
@time = Time.at(0)
end
def forward_to(newTime)
@time = newTime
end
end
#
# Internal classes below
#
# Deprecated. Merged into default implementation.
class TimeOptimizingLogger < ::Madeleine::Logger # :nodoc:
end
end
end
ClockedSnapshotMadeleine = Madeleine::Clock::ClockedSnapshotMadeleine