summaryrefslogtreecommitdiff
path: root/spec/ruby/core/thread/exclusive_spec.rb
blob: 37c4b19d1aee5de2e64a226d5f93728feee369ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
require_relative '../../spec_helper'

ruby_version_is ''...'3.0' do
  describe "Thread.exclusive" do
    before :each do
      ScratchPad.clear
      $VERBOSE, @verbose = nil, $VERBOSE
    end

    after :each do
      $VERBOSE = @verbose
    end

    it "yields to the block" do
      Thread.exclusive { ScratchPad.record true }
      ScratchPad.recorded.should == true
    end

    it "returns the result of yielding" do
      Thread.exclusive { :result }.should == :result
    end

    it "blocks the caller if another thread is also in an exclusive block" do
      m = Mutex.new
      q1 = Queue.new
      q2 = Queue.new

      t = Thread.new {
        Thread.exclusive {
          q1.push :ready
          q2.pop
        }
      }

      q1.pop.should == :ready

      -> { Thread.exclusive { } }.should block_caller

      q2.push :done
      t.join
    end

    it "is not recursive" do
      Thread.exclusive do
        -> { Thread.exclusive { } }.should raise_error(ThreadError)
      end
    end
  end
end