Sha256: d77051d0c0dd9095fba86ffc492dbf60e74ddd523d993f7acd44db068d120358

Contents?: true

Size: 1.11 KB

Versions: 1

Compression:

Stored size: 1.11 KB

Contents

require 'timeout'

module EventLoop
  class << self
    SELECTOR = NIO::Selector.new
    TIMERS = []

    def add_timer(timer)
      timer.start_time = Time.now.to_f + timer.time
      TIMERS << timer
    end

    def register(io, interest=(:rw), &callback)
      monitor = SELECTOR.register(io, interest)
      monitor.value = {
          callback: callback,
      }

    end

    def deregister(io)
      SELECTOR.deregister(io)
    end

    def run_once
      SELECTOR.select(0.2) do |monitor| # Timeout for 1 secs
        monitor.value[:timer].stop unless monitor.value[:timer].nil?
        monitor.value[:callback].call(monitor)
      end
      EventLoop.timer_once
    end

    def timer_once
      now_time = Time.now.to_f
      TIMERS.delete_if do |timer|
        if timer.start_time < now_time
          timer.callback.call
          true
        end
      end
    end

    def start
      return if running?
      @stop = false
      until @stop
        run_once
      end
      @stop = nil
    end

    def stop
      @stop = true
    end

    def running?
      @stop = true if @stop.nil?
      !@stop
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
em-midori-0.1.12 lib/midori/core_ext/event_loop.rb