40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/fluent/counter/mutex_hash.rb', line 40
def synchronize(*keys)
return if keys.empty?
locks = {}
loop do
@mutex.synchronize do
keys.each do |key|
mutex = @mutex_hash[key]
unless mutex
v = Mutex.new
@mutex_hash[key] = v
mutex = v
end
if mutex.try_lock
locks[key] = mutex
else
locks.each_value(&:unlock)
locks = {}
break
end
end
end
next if locks.empty?
locks.each do |(k, v)|
yield @data_store, k
v.unlock
end
break
end
end
|