futex 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|