Sha256: 7e8b824b26aa59f657de1a7427fc8679f3c6802c4397817fce339e46d7be5010

Contents?: true

Size: 1.47 KB

Versions: 4

Compression:

Stored size: 1.47 KB

Contents

require 'thread'

class ThreadSpy
  attr_reader :join_seconds, :join_called
  attr_reader :raised_exception

  def initialize(&block)
    @block    = block
    @mutex    = Mutex.new
    @cond_var = ConditionVariable.new

    @join_seconds     = nil
    @join_called      = false
    @raised_exception = nil

    @thread = Thread.new do
      @mutex.synchronize{ @cond_var.wait(@mutex) } if @block.nil?
      @block.call
    end
  end

  def block=(new_block)
    @block = new_block
    @mutex.synchronize{ @cond_var.signal }
  end

  def join(seconds = nil)
    @join_seconds = seconds
    @join_called  = true
    @thread.join(seconds)
  end

  def raise(exception)
    @raised_exception = exception
    @thread.raise(exception)
  end

  def status; @thread.status; end
  def alive?; @thread.alive?; end
end

class MutexSpy < Mutex
  attr_accessor :synchronize_called

  def initialize
    @synchronize_called = false
    super
  end

  def synchronize
    @synchronize_called = true
    super
  end
end

class ConditionVariableSpy < ConditionVariable
  attr_reader :signal_called, :broadcast_called
  attr_reader :wait_called_on, :wait_call_count

  def initialize
    @signal_called    = false
    @broadcast_called = false
    @wait_called_on   = nil
    @wait_call_count  = 0
    super
  end

  def signal
    @signal_called = true
    super
  end

  def broadcast
    @broadcast_called = true
    super
  end

  def wait(mutex)
    @wait_called_on  = mutex
    @wait_call_count += 1
    super
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dat-worker-pool-0.6.3 test/support/thread_spies.rb
dat-worker-pool-0.6.2 test/support/thread_spies.rb
dat-worker-pool-0.6.1 test/support/thread_spies.rb
dat-worker-pool-0.6.0 test/support/thread_spies.rb