lib/sync-defer.rb in sync-defer-0.9.4 vs lib/sync-defer.rb in sync-defer-0.9.5

- old
+ new

@@ -1,6 +1,8 @@ +require 'fiber' + begin require 'eventmachine/sync-defer' rescue LoadError end @@ -8,25 +10,42 @@ 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 Object.const_defined?(:EventMachine) && EventMachine.reactor_running? + if root_fiber? + fallback("Not called inside a fiber.", *args, &block) + + elsif 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 - $stderr.puts("SyncDefer: WARN: No reactor found. " \ - "Only cool.io and eventmachine are supported.") - $stderr.puts(" Called from: #{caller.last(5).inspect}") - args << block if block_given? - if args.size == 1 - args.first.call - else - args.map(&:call) - end + fallback("No reactor found.", *args, block) + end + end + + def root_fiber? + RootFiber == Fiber.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.last(5).inspect}") + args << block if block_given? + if args.size == 1 + args.first.call + else + args.map(&:call) end end end