Sha256: 7eab99881e2e0e35a9f9657f3aadd77768781f529ed7be05c2df25f47b54e1d8

Contents?: true

Size: 1.1 KB

Versions: 1

Compression:

Stored size: 1.1 KB

Contents

require_relative '../lib/iou'
require 'socket'

class IOUEventLoop
  attr_reader :ring

  def initialize
    @ring = IOU::Ring.new
  end

  def async_queue
    @async_queue ||= []
  end

  def async(&block)
    @async_queue << block
    signal if @waiting
  end

  def signal
    # generate an event to cause process_completions to return
    ring.prep_nop
    ring.submit
  end

  def run_async_tasks
    pending = @async_queue
    @async_queue = []
    pending&.each(&:call)
  end

  def run
    yield if block_given?
    while !@stopped
      run_async_tasks
      @waiting = true
      ring.process_completions
      @waiting = false
    end
  end

  def stop
    @stopped = true
    signal if @waiting
  end

  def timeout(delay, &block)
    ring.prep_timeout(interval: delay, &block)
    ring.submit
  end

  def interval(period, &block)
    ring.prep_timeout(interval: period, multishot: true, &block)
    ring.submit
  end
end

# exaple usage
event_loop = IOUEventLoop.new

trap('SIGINT') { event_loop.stop }

event_loop.run do
  event_loop.interval(1) do
    puts "The time is #{Time.now}"
  end
end

puts "Stopped"

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
iou-0.1 examples/event_loop.rb