Sha256: 692107adb0859715fb6b0311727fb25a7ee47b50b5b43d002b4b31d5a3b61cb2
Contents?: true
Size: 1.82 KB
Versions: 1
Compression:
Stored size: 1.82 KB
Contents
# use nio4r implement event loop, inspired from eventmachine/pure_ruby implement require 'set' module LightIO module Backend class Error < RuntimeError end class UnknownTimer < Error end class Timers def generate_uuid @ix ||= 0 @ix += 1 end def initialize @timers = SortedSet.new @timers_registry = {} end def add_timer(timer) uuid = generate_uuid @timers.add([Time.now + timer.interval, uuid]) @timers_registry[uuid] = timer.callback end def cancel_timer(timer) raise Error, "unregistered timer" unless timer.uuid && @timers_registry.has_key?(timer.uuid) @timers_registry[uuid] = false end def fire(current_loop_time) @timers.each do |t| if t.first <= current_loop_time @timers.delete(t) callback = @timers_registry.delete(t.last) next if callback == false # timer cancelled raise UnknownTimer, "timer id: #{t.last}" if callback.nil? callback.call else break end end end end class NIO def initialize # @selector = NIO::Selector.new @current_loop_time = nil @running = false @timers = Timers.new end def run raise Error, "already running" if @running @running = true loop do @current_loop_time = Time.now run_timers end end def run_timers @timers.fire(@current_loop_time) end def add_timer(timer) timer.uuid = @timers.add_timer(timer) end def cancel_timer(timer) @timers.cancel_timer(timer) end def stop return unless @running @running = false raise end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
lightio-0.1.0.pre | lib/lightio/backend/nio.rb |