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