lib/graphql/dataloader.rb in graphql-2.2.1 vs lib/graphql/dataloader.rb in graphql-2.2.2

- old
+ new

@@ -117,16 +117,11 @@ # # Dataloader will resume the fiber after the requested data has been loaded (by another Fiber). # # @return [void] def yield - if use_fiber_resume? - Fiber.yield - else - parent_fiber = Thread.current[:parent_fiber] - parent_fiber.transfer - end + Fiber.yield nil end # @api private Nothing to see here def append_job(&job) @@ -167,11 +162,15 @@ run res ensure @pending_jobs = prev_queue prev_pending_keys.each do |source_instance, pending| - source_instance.pending.merge!(pending) + pending.each do |key, value| + if !source_instance.results.key?(key) + source_instance.pending[key] = value + end + end end end def run job_fibers = [] @@ -181,11 +180,11 @@ first_pass = true manager = spawn_fiber do while first_pass || job_fibers.any? first_pass = false - while (f = job_fibers.shift || spawn_job_fiber) + while (f = (job_fibers.shift || spawn_job_fiber)) if f.alive? finished = run_fiber(f) if !finished next_job_fibers << f end @@ -202,59 +201,49 @@ end end end join_queues(source_fibers, next_source_fibers) end - end end run_fiber(manager) + if manager.alive? + raise "Invariant: Manager fiber didn't terminate properly." + end + + if job_fibers.any? + raise "Invariant: job fibers should have exited but #{job_fibers.size} remained" + end + if source_fibers.any? + raise "Invariant: source fibers should have exited but #{source_fibers.size} remained" + end rescue UncaughtThrowError => e throw e.tag, e.value end def run_fiber(f) - if use_fiber_resume? - f.resume - else - f.transfer - end + f.resume end def spawn_fiber fiber_vars = get_fiber_variables - parent_fiber = use_fiber_resume? ? nil : Fiber.current Fiber.new(blocking: !@nonblocking) { set_fiber_variables(fiber_vars) - Thread.current[:parent_fiber] = parent_fiber yield # With `.transfer`, you have to explicitly pass back to the parent -- # if the fiber is allowed to terminate normally, control is passed to the main fiber instead. - if parent_fiber - parent_fiber.transfer(true) - else - true - end + true } end private def join_queues(prev_queue, new_queue) @nonblocking && Fiber.scheduler.run prev_queue.concat(new_queue) new_queue.clear - end - - def use_fiber_resume? - Fiber.respond_to?(:scheduler) && - ( - (defined?(::DummyScheduler) && Fiber.scheduler.is_a?(::DummyScheduler)) || - (defined?(::Evt) && ::Evt::Scheduler.singleton_class::BACKENDS.any? { |be| Fiber.scheduler.is_a?(be) }) || - (defined?(::Libev) && Fiber.scheduler.is_a?(::Libev::Scheduler)) - ) end def spawn_job_fiber if @pending_jobs.any? spawn_fiber do