class Fibril::ForkedNonBlockingIOWrapper

Attributes

read[RW]
write[RW]

Public Class Methods

new(*, &block) click to toggle source
# File lib/fibril/forked_non_blocking_io_wrapper.rb, line 7
def initialize(*, &block)
  read, write = IO.pipe
  self.read, self.write = read, write
  self.response_queue = []
  self.fibrils = []
  define_singleton_method(:loop, &block)
end

Public Instance Methods

freceive(*args) click to toggle source
# File lib/fibril/forked_non_blocking_io_wrapper.rb, line 44
def freceive(*args)
  if args.any?
    ingest(*args)
  else
    method(:ingest)
  end
end
receive(*args) click to toggle source
# File lib/fibril/forked_non_blocking_io_wrapper.rb, line 40
def receive(*args)
  self.write.puts URI.escape(Marshal.dump(args)) rescue nil
end
start() click to toggle source
# File lib/fibril/forked_non_blocking_io_wrapper.rb, line 15
def start
  freceive = method(:freceive)
  block = method(:loop)
  read, write = self.read, self.write
  fibril{
    fork do
      read.close
      block[]
      exit(0)
    end

    write.close
    begin
      Fibril.current.tick
      while message = read.gets
        freceive[*Marshal.load(URI.unescape(message))]
        Fibril.current.tick
      end
    rescue Exception => e
      puts "Exception! : #{e}"
      puts e.backtrace
    end
  }
end