thread_safe 0.1.0 → 0.1.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 +7 -0
- data/.gitignore +1 -0
- data/lib/thread_safe.rb +2 -1
- data/lib/thread_safe/synchronized_delegator.rb +35 -0
- data/lib/thread_safe/version.rb +1 -1
- data/test/test_synchronized_delegator.rb +42 -0
- data/thread_safe.gemspec +4 -3
- metadata +42 -62
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e94921d1ca19c1fb6bb564e2db17fd724db5679f
|
4
|
+
data.tar.gz: f7305e1979a5366d5859d0e2fab80f111236c413
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1f4dae8815d781c06b68d0d2da595d5fd039b22e1eb8586dbca6ec6a0026e73eaf98b992b3a297580bc6f4b1859834b53bb44b45af043639ee1efac4492f8fb5
|
7
|
+
data.tar.gz: 18e37ab075d01e92d0dd46c3553d899bd5d9484c014fdad7785f8c5fe4556b95e88131eb92b474a1398ca1b9f5e07a7b559383baa33931d3a8b094290abc0d3c
|
data/.gitignore
CHANGED
data/lib/thread_safe.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
# This class provides a trivial way to synchronize all calls to a given object
|
2
|
+
# by wrapping it with a Delegator that performs Mutex#lock/unlock calls around
|
3
|
+
# the delegated #send. Example:
|
4
|
+
#
|
5
|
+
# array = [] # not thread-safe on many impls
|
6
|
+
# array = MutexedDelegator.new(array) # thread-safe
|
7
|
+
#
|
8
|
+
# A simple Mutex provides a very coarse-grained way to synchronize a given
|
9
|
+
# object, in that it will cause synchronization for methods that have no
|
10
|
+
# need for it, but this is a trivial way to get thread-safety where none may
|
11
|
+
# exist currently on some implementations.
|
12
|
+
#
|
13
|
+
# This class is currently being considered for inclusion into stdlib, via
|
14
|
+
# https://bugs.ruby-lang.org/issues/8556
|
15
|
+
|
16
|
+
require 'delegate'
|
17
|
+
|
18
|
+
unless defined?(SynchronizedDelegator)
|
19
|
+
class SynchronizedDelegator < SimpleDelegator
|
20
|
+
def initialize(*)
|
21
|
+
super
|
22
|
+
@mutex = Mutex.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(m, *args, &block)
|
26
|
+
begin
|
27
|
+
mutex = @mutex
|
28
|
+
mutex.lock
|
29
|
+
super
|
30
|
+
ensure
|
31
|
+
mutex.unlock
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/thread_safe/version.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'thread_safe/synchronized_delegator.rb'
|
3
|
+
|
4
|
+
class TestSynchronizedDelegator < Test::Unit::TestCase
|
5
|
+
def test_wraps_array
|
6
|
+
ary = []
|
7
|
+
sync_ary = SynchronizedDelegator.new(ary)
|
8
|
+
|
9
|
+
ary << 1
|
10
|
+
assert_equal 1, sync_ary[0]
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_synchronizes_access
|
14
|
+
ary = []
|
15
|
+
sync_ary = SynchronizedDelegator.new(ary)
|
16
|
+
|
17
|
+
t1_continue = false
|
18
|
+
t2_continue = false
|
19
|
+
|
20
|
+
t1 = Thread.new do
|
21
|
+
sync_ary << 1
|
22
|
+
sync_ary.each do
|
23
|
+
t2_continue = true
|
24
|
+
Thread.pass until t1_continue
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
t2 = Thread.new do
|
29
|
+
Thread.pass until t2_continue
|
30
|
+
sync_ary << 2
|
31
|
+
end
|
32
|
+
|
33
|
+
Thread.pass until t2.status == 'sleep'
|
34
|
+
assert_equal 1, ary.size
|
35
|
+
|
36
|
+
t1_continue = true
|
37
|
+
t1.join
|
38
|
+
t2.join
|
39
|
+
|
40
|
+
assert_equal 2, sync_ary.size
|
41
|
+
end
|
42
|
+
end
|
data/thread_safe.gemspec
CHANGED
@@ -2,19 +2,20 @@
|
|
2
2
|
require File.expand_path('../lib/thread_safe/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Charles Oliver Nutter"
|
6
|
-
gem.email = ["headius@headius.com"
|
5
|
+
gem.authors = ["Charles Oliver Nutter"]
|
6
|
+
gem.email = ["headius@headius.com"]
|
7
7
|
gem.description = %q{Thread-safe collections and utilities for Ruby}
|
8
8
|
gem.summary = %q{A collection of data structures and utilities to make thread-safe programming in Ruby easier}
|
9
9
|
gem.homepage = "https://github.com/headius/thread_safe"
|
10
10
|
|
11
|
-
gem.files = `git ls-files`.split($\)
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.platform = 'java' if defined?(JRUBY_VERSION)
|
13
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
14
14
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
15
|
gem.name = "thread_safe"
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = Threadsafe::VERSION
|
18
|
+
gem.license = "Apache-2.0"
|
18
19
|
|
19
20
|
gem.add_dependency 'atomic'
|
20
21
|
end
|
metadata
CHANGED
@@ -1,49 +1,36 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: thread_safe
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Charles Oliver Nutter
|
14
|
-
- thedarkone
|
15
8
|
autorequire:
|
16
9
|
bindir: bin
|
17
10
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
dependencies:
|
22
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2013-07-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
23
14
|
name: atomic
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
version: "0"
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
34
20
|
type: :runtime
|
35
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
36
27
|
description: Thread-safe collections and utilities for Ruby
|
37
|
-
email:
|
28
|
+
email:
|
38
29
|
- headius@headius.com
|
39
|
-
- thedarkone2@gmail.com
|
40
30
|
executables: []
|
41
|
-
|
42
31
|
extensions: []
|
43
|
-
|
44
32
|
extra_rdoc_files: []
|
45
|
-
|
46
|
-
files:
|
33
|
+
files:
|
47
34
|
- .gitignore
|
48
35
|
- Gemfile
|
49
36
|
- LICENSE
|
@@ -62,6 +49,7 @@ files:
|
|
62
49
|
- lib/thread_safe/mri_cache_backend.rb
|
63
50
|
- lib/thread_safe/non_concurrent_cache_backend.rb
|
64
51
|
- lib/thread_safe/synchronized_cache_backend.rb
|
52
|
+
- lib/thread_safe/synchronized_delegator.rb
|
65
53
|
- lib/thread_safe/util.rb
|
66
54
|
- lib/thread_safe/util/adder.rb
|
67
55
|
- lib/thread_safe/util/atomic_reference.rb
|
@@ -77,45 +65,37 @@ files:
|
|
77
65
|
- test/test_cache_loops.rb
|
78
66
|
- test/test_hash.rb
|
79
67
|
- test/test_helper.rb
|
68
|
+
- test/test_synchronized_delegator.rb
|
80
69
|
- thread_safe.gemspec
|
81
|
-
- lib/thread_safe/jruby_cache_backend.jar
|
82
|
-
has_rdoc: true
|
83
70
|
homepage: https://github.com/headius/thread_safe
|
84
|
-
licenses:
|
85
|
-
|
71
|
+
licenses:
|
72
|
+
- Apache-2.0
|
73
|
+
metadata: {}
|
86
74
|
post_install_message:
|
87
75
|
rdoc_options: []
|
88
|
-
|
89
|
-
require_paths:
|
76
|
+
require_paths:
|
90
77
|
- lib
|
91
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
none: false
|
102
|
-
requirements:
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
hash: 3
|
106
|
-
segments:
|
107
|
-
- 0
|
108
|
-
version: "0"
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
109
88
|
requirements: []
|
110
|
-
|
111
89
|
rubyforge_project:
|
112
|
-
rubygems_version:
|
90
|
+
rubygems_version: 2.0.3
|
113
91
|
signing_key:
|
114
|
-
specification_version:
|
115
|
-
summary: A collection of data structures and utilities to make thread-safe programming
|
116
|
-
|
92
|
+
specification_version: 4
|
93
|
+
summary: A collection of data structures and utilities to make thread-safe programming
|
94
|
+
in Ruby easier
|
95
|
+
test_files:
|
117
96
|
- test/test_array.rb
|
118
97
|
- test/test_cache.rb
|
119
98
|
- test/test_cache_loops.rb
|
120
99
|
- test/test_hash.rb
|
121
100
|
- test/test_helper.rb
|
101
|
+
- test/test_synchronized_delegator.rb
|