@@ -136,26 +136,24 @@ def run
136136 # This is where an evented approach would be even better -- can we tell which
137137 # fibers are ready to continue, and continue execution there?
138138 #
139- source_fiber_stack = if ( first_source_fiber = create_source_fiber )
139+ source_fiber_queue = if ( first_source_fiber = create_source_fiber )
140140 [ first_source_fiber ]
141141 else
142142 nil
143143 end
144144
145- if source_fiber_stack
146- # Use a stack with `.pop` here so that when a source causes another source to become pending,
147- # that newly-pending source will run _before_ the one that depends on it.
148- # (See below where the old fiber is pushed to the stack, then the new fiber is pushed on the stack.)
149- while ( outer_source_fiber = source_fiber_stack . pop )
145+ if source_fiber_queue
146+ while ( outer_source_fiber = source_fiber_queue . shift )
150147 resume ( outer_source_fiber )
151148
152- if outer_source_fiber . alive?
153- source_fiber_stack << outer_source_fiber
154- end
155149 # If this source caused more sources to become pending, run those before running this one again:
156150 next_source_fiber = create_source_fiber
157151 if next_source_fiber
158- source_fiber_stack << next_source_fiber
152+ source_fiber_queue << next_source_fiber
153+ end
154+
155+ if outer_source_fiber . alive?
156+ source_fiber_queue << outer_source_fiber
159157 end
160158 end
161159 end
@@ -224,16 +222,16 @@ def resume(fiber)
224222 #
225223 # @see https://github.com/rmosolgo/graphql-ruby/issues/3449
226224 def spawn_fiber
227- fiber_locals = { }
225+ fiber_locals = { }
228226
229227 Thread . current . keys . each do |fiber_var_key |
230228 fiber_locals [ fiber_var_key ] = Thread . current [ fiber_var_key ]
231- end
229+ end
232230
233- Fiber . new do
231+ Fiber . new do
234232 fiber_locals . each { |k , v | Thread . current [ k ] = v }
235233 yield
236- end
234+ end
237235 end
238236 end
239237end
0 commit comments