futex 0.8.2 → 0.8.3
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/.rubocop.yml +1 -1
- data/futex.gemspec +3 -3
- data/lib/futex.rb +16 -14
- data/test/test_futex.rb +9 -0
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 621fe1e76d09dd787dc6e5a76b7137d44f981ac303d5c0e825a0af6d885695ca
|
4
|
+
data.tar.gz: 0ab8b3899131e5e5514e2ede85cc7f18825a74915fa59b26e50e4712c1e0f0c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b2a86b5382799a2b3f7591d0408bae3a1fc3f9b2f01b99b24e18b0598de50d9a04bf2904619ad135322346de41ee72e3b96a1de71fd9b74046495f1203e2ed6
|
7
|
+
data.tar.gz: a9fa21e4a920d835454fa47f458933e1810344677e870a8df7c45f1919db4dfc3e6324b5a6876e6ffa9bbbbce4bf0506e755afbab10e25e6fb7d426195ab6c93
|
data/.rubocop.yml
CHANGED
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.8.
|
34
|
+
s.version = '0.8.3'
|
35
35
|
s.license = 'MIT'
|
36
36
|
s.summary = 'File-based mutex'
|
37
37
|
s.description = 'Ruby Gem for file-based locking'
|
@@ -46,7 +46,7 @@ Gem::Specification.new do |s|
|
|
46
46
|
s.add_development_dependency 'openssl', '2.1.2'
|
47
47
|
s.add_development_dependency 'rake', '12.3.1'
|
48
48
|
s.add_development_dependency 'rdoc', '4.3.0'
|
49
|
-
s.add_development_dependency 'rubocop', '0.
|
50
|
-
s.add_development_dependency 'rubocop-rspec', '1.
|
49
|
+
s.add_development_dependency 'rubocop', '0.62.0'
|
50
|
+
s.add_development_dependency 'rubocop-rspec', '1.31.0'
|
51
51
|
s.add_development_dependency 'threads', '0.3.0'
|
52
52
|
end
|
data/lib/futex.rb
CHANGED
@@ -67,6 +67,9 @@ class Futex
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
# Global file for locks counting
|
71
|
+
COUNTS = File.join(Dir.tmpdir, 'futex.lock').freeze
|
72
|
+
|
70
73
|
# Creates a new instance of the class.
|
71
74
|
def initialize(path, log: STDOUT, timeout: 16, sleep: 0.005,
|
72
75
|
lock: path + '.lock', logging: false)
|
@@ -163,41 +166,40 @@ access to #{@path}, #{age(start)} already: #{IO.read(@lock)} \
|
|
163
166
|
def open_synchronized(path)
|
164
167
|
path = File.absolute_path(path)
|
165
168
|
file = nil
|
166
|
-
synchronized do |
|
169
|
+
synchronized do |counts|
|
167
170
|
file = File.open(path, File::CREAT | File::RDWR)
|
168
|
-
|
169
|
-
|
170
|
-
File.write(
|
171
|
+
refs = deserialize(File.read(counts.path))
|
172
|
+
refs[path] = (refs[path] || 0) + 1
|
173
|
+
File.write(counts.path, serialize(refs))
|
171
174
|
end
|
172
175
|
yield file
|
173
176
|
ensure
|
174
|
-
synchronized do |
|
177
|
+
synchronized do |counts|
|
175
178
|
file.close
|
176
|
-
|
177
|
-
|
178
|
-
if
|
179
|
+
refs = deserialize(File.read(counts.path))
|
180
|
+
refs[path] -= 1
|
181
|
+
if refs[path].zero?
|
179
182
|
FileUtils.rm(path, force: true)
|
180
|
-
|
183
|
+
refs.delete(path)
|
181
184
|
end
|
182
|
-
File.write(
|
185
|
+
File.write(counts.path, serialize(refs))
|
183
186
|
end
|
184
187
|
end
|
185
188
|
|
186
189
|
def synchronized
|
187
|
-
|
188
|
-
File.open(ref_counts_file, File::CREAT | File::RDWR) do |f|
|
190
|
+
File.open(COUNTS, File::CREAT | File::RDWR) do |f|
|
189
191
|
f.flock(File::LOCK_EX)
|
190
192
|
yield f
|
191
193
|
end
|
192
194
|
end
|
193
195
|
|
194
196
|
def serialize(data)
|
195
|
-
# NOTE: JSON is just an example,
|
196
|
-
# use whatever serialization is more appropriate here
|
197
197
|
data.to_json
|
198
198
|
end
|
199
199
|
|
200
200
|
def deserialize(data)
|
201
201
|
data.empty? ? {} : JSON.parse(data)
|
202
|
+
rescue JSON::ParserError
|
203
|
+
{}
|
202
204
|
end
|
203
205
|
end
|
data/test/test_futex.rb
CHANGED
@@ -191,6 +191,15 @@ class FutexTest < Minitest::Test
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
+
def test_works_with_broken_counts_file
|
195
|
+
IO.write(Futex::COUNTS, 'fds')
|
196
|
+
Dir.mktmpdir do |dir|
|
197
|
+
Futex.new(File.join(dir, 'hey.txt')).open do |f|
|
198
|
+
assert(!File.exist?(f))
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
194
203
|
private
|
195
204
|
|
196
205
|
def hash(text)
|
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.8.
|
4
|
+
version: 0.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -72,28 +72,28 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
75
|
+
version: 0.62.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: 0.62.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop-rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
89
|
+
version: 1.31.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
96
|
+
version: 1.31.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: threads
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,8 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
148
|
- !ruby/object:Gem::Version
|
149
149
|
version: '0'
|
150
150
|
requirements: []
|
151
|
-
|
152
|
-
rubygems_version: 2.7.6
|
151
|
+
rubygems_version: 3.0.1
|
153
152
|
signing_key:
|
154
153
|
specification_version: 2
|
155
154
|
summary: File-based mutex
|