Class: Lusnoc::Mutex

Inherits:
Object
  • Object
show all
Includes:
Helper
Defined in:
lib/lusnoc/mutex.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helper

#build_url, #logger

Constructor Details

#initialize(key, value: Socket.gethostname, ttl: 20) ⇒ Mutex

Returns a new instance of Mutex.



10
11
12
13
14
# File 'lib/lusnoc/mutex.rb', line 10

def initialize(key, value: Socket.gethostname, ttl: 20)
  @key = key
  @value = value
  @ttl = ttl
end

Instance Attribute Details

#keyObject (readonly)

Returns the value of attribute key.



8
9
10
# File 'lib/lusnoc/mutex.rb', line 8

def key
  @key
end

#ownerObject (readonly)

Returns the value of attribute owner.



8
9
10
# File 'lib/lusnoc/mutex.rb', line 8

def owner
  @owner
end

#valueObject (readonly)

Returns the value of attribute value.



8
9
10
# File 'lib/lusnoc/mutex.rb', line 8

def value
  @value
end

Instance Method Details

#locked?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/lusnoc/mutex.rb', line 16

def locked?
  !!owner
end

#on_mutex_lost(&block) ⇒ Object



32
33
34
# File 'lib/lusnoc/mutex.rb', line 32

def on_mutex_lost(&block)
  @on_mutex_lost = block
end

#owned?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/lusnoc/mutex.rb', line 20

def owned?
  owner == Thread.current
end

#session_idObject



24
25
26
# File 'lib/lusnoc/mutex.rb', line 24

def session_id
  @session&.id
end

#synchronize(timeout: 0, &block) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/lusnoc/mutex.rb', line 36

def synchronize(timeout: 0, &block)
  t = Timeouter::Timer.new(timeout, eclass: TimeoutError, message: 'mutex acquisition expired')

  Session.new("mutex_session/#{key}", ttl: @ttl) do |session|
    @session = session
    session.on_session_die do
      @owner = nil
      @on_mutex_lost&.call(self)
    end

    return acquisition_loop! key, session, value, t, &block
  ensure
    release(key, session.id, timeout: 2) rescue nil
    logger.info("Mutex[#{key}] released for Session[#{session.name}:#{session.id}]")
    @owner = nil
    @session = nil
  end
end