Sha256: 9e16bb0cfa9d1e5558fcb80cc41e2d6f688df2a2479da1c91391fb1a76d9d945

Contents?: true

Size: 1 KB

Versions: 2

Compression:

Stored size: 1 KB

Contents

# frozen_string_literal: true

Exceptions = import '../core/exceptions'

# Thread extensions
class ::Thread
  attr_reader :main_fiber

  alias_method :orig_initialize, :initialize
  def initialize(*args, &block)
    @join_wait_queue = Gyro::Queue.new
    @block = block
    orig_initialize do
      setup_fiber_scheduling
      block.(*args)
      signal_waiters
    ensure
      stop_event_selector
    end
  end

  def signal_waiters
    @join_wait_queue.shift_each { |w| w.signal!(self) }
  end

  alias_method :orig_join, :join
  def join(timeout = nil)
    return unless alive?

    async = Gyro::Async.new
    @join_wait_queue << async

    if timeout
      move_on_after(timeout) { async.await }
    else
      async.await
    end
  end

  alias_method :orig_inspect, :inspect
  def inspect
    return orig_inspect if self == Thread.main

    state = status || 'dead'
    "#<Thread:#{object_id} #{location} (#{state})>"
  end
  alias_method :to_s, :inspect

  def location
    @block.source_location.join(':')
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
polyphony-0.28 lib/polyphony/extensions/thread.rb
polyphony-0.27 lib/polyphony/extensions/thread.rb