futex 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/futex.gemspec +1 -1
- data/lib/futex.rb +11 -6
- data/test/test_futex.rb +18 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fe725623e9222ab65747891baf33b18b02aa14b4b9839386b14b9b40689d677
|
4
|
+
data.tar.gz: a56328499e4fe088514b7c4bd6c8cd79165c58f7e18ce40e12db9997e9ac580b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bd6f3ced41b81b3e91489e09c7e796e45b6633181d520d3cf0912f7a69c28568ab3320a3007eb58210e00eb1396a72966f79050fb7ce09a13accde44d8ab2b6
|
7
|
+
data.tar.gz: '091d37893523574dbb618c6ee55e9721b1e042732e87a318bd50ae2613b3dd0252aedf8ee8ecd7e48c2a24a4f0ce6b7d44edbe93cbd66a77d7041cfd90424bcd'
|
data/futex.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
s.rubygems_version = '2.3.3'
|
32
32
|
s.required_ruby_version = '>=2.3'
|
33
33
|
s.name = 'futex'
|
34
|
-
s.version = '0.4.
|
34
|
+
s.version = '0.4.1'
|
35
35
|
s.license = 'MIT'
|
36
36
|
s.summary = 'File-based mutex'
|
37
37
|
s.description = 'Ruby Gem for file-based locking'
|
data/lib/futex.rb
CHANGED
@@ -77,28 +77,33 @@ class Futex
|
|
77
77
|
sleep(@sleep)
|
78
78
|
cycle += 1
|
79
79
|
if Time.now - start > @timeout
|
80
|
-
raise "
|
81
|
-
exclusive access to the file #{@path} \
|
80
|
+
raise "#{badge} can't get exclusive access to the file #{@path} \
|
82
81
|
because of the lock at #{@lock}, after #{age(start)} \
|
83
82
|
of waiting: #{IO.read(@lock)}"
|
84
83
|
end
|
85
84
|
if (cycle % step).zero? && Time.now - start > @timeout / 2
|
86
|
-
debug("
|
85
|
+
debug("#{badge} still waiting for \
|
87
86
|
exclusive access to #{@path}, #{age(start)} already: #{IO.read(@lock)}")
|
88
87
|
end
|
89
88
|
end
|
90
|
-
debug("Locked by
|
89
|
+
debug("Locked by #{badge} in #{age(start)}: #{@path} \
|
91
90
|
(attempt no.#{cycle})")
|
92
|
-
File.write(@lock,
|
91
|
+
File.write(@lock, badge)
|
93
92
|
acq = Time.now
|
94
93
|
res = yield(@path)
|
95
|
-
debug("Unlocked by
|
94
|
+
debug("Unlocked by #{badge} in #{age(acq)}: #{@path}")
|
96
95
|
res
|
97
96
|
end
|
98
97
|
end
|
99
98
|
|
100
99
|
private
|
101
100
|
|
101
|
+
def badge
|
102
|
+
tname = Thread.current.name
|
103
|
+
tname = 'nil' if tname.nil?
|
104
|
+
"##{Process.pid}/#{tname}"
|
105
|
+
end
|
106
|
+
|
102
107
|
def age(time)
|
103
108
|
"#{((Time.now - time) * 1000).round}ms"
|
104
109
|
end
|
data/test/test_futex.rb
CHANGED
@@ -61,6 +61,24 @@ class FutexTest < Minitest::Test
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
def test_raises_if_cant_lock
|
65
|
+
Dir.mktmpdir do |dir|
|
66
|
+
path = File.join(dir, 'the/simple/file.txt')
|
67
|
+
Thread.start do
|
68
|
+
Futex.new(path).open do
|
69
|
+
sleep 10
|
70
|
+
end
|
71
|
+
end
|
72
|
+
sleep 0.1
|
73
|
+
ex = assert_raises do
|
74
|
+
Futex.new(path, timeout: 0.1).open do |f|
|
75
|
+
# Will never reach this point
|
76
|
+
end
|
77
|
+
end
|
78
|
+
assert(ex.message.include?('can\'t get exclusive access to the file'), ex)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
64
82
|
def test_non_exclusive_locking
|
65
83
|
Dir.mktmpdir do |dir|
|
66
84
|
path = File.join(dir, 'g/e/f/file.txt')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: futex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|