Method: Async::Scheduler#block

Defined in:
lib/async/scheduler.rb

#block(blocker, timeout) ⇒ Object

Invoked when a fiber tries to perform a blocking operation which cannot continue. A corresponding call #unblock must be performed to allow this fiber to continue.



233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/async/scheduler.rb', line 233

def block(blocker, timeout)
  # $stderr.puts "block(#{blocker}, #{Fiber.current}, #{timeout})"
  fiber = Fiber.current
  
  if timeout
    timer = @timers.after(timeout) do
      if fiber.alive?
        fiber.transfer(false)
      end
    end
  end
  
  begin
    @blocked += 1
    @selector.transfer
  ensure
    @blocked -= 1
  end
ensure
  timer&.cancel!
end