Sha256: 1b42fc2323119feb3505a282641bc5ccec7cebee119edf1ede2f38422da666f9

Contents?: true

Size: 1.26 KB

Versions: 2

Compression:

Stored size: 1.26 KB

Contents

require 'fiber'

begin
  require 'eventmachine/sync-defer'
rescue LoadError
end

begin
  require 'cool.io/sync-defer'
rescue LoadError
end

module SyncDefer
  # assume we would always require 'rest-core' in root fiber
  RootFiber = Fiber.current

  module_function
  def defer *args, &block
    if fiber_wrapped?
      if Object.const_defined?(:EventMachine) &&
         EventMachine.reactor_running?
        EventMachine::SyncDefer.defer(*args, &block)

      elsif Object.const_defined?(:Coolio) &&
            Coolio::Loop.default.has_active_watchers?
        Coolio::SyncDefer.defer(*args, &block)

      else
        fallback("No reactor found.", *args, block)
      end

    else
      fallback("Not called inside a fiber.", *args, &block)
    end
  end

  def fiber_wrapped?
    # because under a thread, Fiber.current won't return the root fiber
    RootFiber != Fiber.current && Thread.main == Thread.current
  end

  def fallback message, *args, &block
    $stderr.puts("SyncDefer: WARN: #{message}")
    $stderr.puts("           Falling back to run the computation directly.")
    $stderr.puts("           Called from: #{caller.first(5).inspect}")
    args << block if block_given?
    if args.size == 1
      args.first.call
    else
      args.map(&:call)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
sync-defer-0.9.7 lib/sync-defer.rb
sync-defer-0.9.6 lib/sync-defer.rb