Class: Smith::Tool::CallAdmission

Inherits:
Object
  • Object
show all
Defined in:
lib/smith/tool/call_admission.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tool:, reservation:) ⇒ CallAdmission

Returns a new instance of CallAdmission.



27
28
29
30
31
32
# File 'lib/smith/tool/call_admission.rb', line 27

def initialize(tool:, reservation:)
  @tool = tool
  @reservation = reservation
  @available = true
  @mutex = Mutex.new
end

Class Method Details

.around(admission, &block) ⇒ Object

Raises:

  • (ArgumentError)


13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/smith/tool/call_admission.rb', line 13

def self.around(admission, &block)
  raise ArgumentError, "block required" unless block

  previous = current
  Thread.handle_interrupt(Object => :never) do
    Thread.current[THREAD_KEY] = admission
    begin
      Thread.handle_interrupt(Object => :immediate, &block)
    ensure
      Thread.current[THREAD_KEY] = previous
    end
  end
end

.currentObject



9
10
11
# File 'lib/smith/tool/call_admission.rb', line 9

def self.current
  Thread.current[THREAD_KEY]
end

Instance Method Details

#claim(tool) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/smith/tool/call_admission.rb', line 34

def claim(tool)
  @mutex.synchronize do
    return false unless @available && @tool.equal?(tool)

    @available = false
    @reservation.claim
  end
end