synchronizable 0.0.1 → 0.0.2
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.
- data/README.rdoc +15 -0
- data/lib/synchronizable.rb +10 -2
- data/lib/synchronizable/version.rb +1 -1
- data/spec/synchronizable/synchronizable_spec.rb +26 -0
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -15,6 +15,8 @@ Synchronizable is available as a RubyGem:
|
|
15
15
|
|
16
16
|
== Examples
|
17
17
|
|
18
|
+
=== Making an instance synchronizable
|
19
|
+
|
18
20
|
class Foo
|
19
21
|
def bar
|
20
22
|
end
|
@@ -27,6 +29,8 @@ Synchronizable is available as a RubyGem:
|
|
27
29
|
# the foo instance now has all methods synchronized / thread-safe
|
28
30
|
foo.extend(Synchronizable)
|
29
31
|
|
32
|
+
=== Making a class synchronizable
|
33
|
+
|
30
34
|
# note that classes are objects in Ruby and can also be synchronized
|
31
35
|
class Bar
|
32
36
|
def self.foo
|
@@ -36,6 +40,17 @@ Synchronizable is available as a RubyGem:
|
|
36
40
|
# only class/singleton methods will become synchronized
|
37
41
|
Bar.extend(Synchronizable)
|
38
42
|
|
43
|
+
=== Utilizing the #synchronize method to protect a block
|
44
|
+
|
45
|
+
# the synchronize method takes a block and executes it
|
46
|
+
# in a thread-safe manner
|
47
|
+
s = "this is a test"
|
48
|
+
s.extend(Synchronizable)
|
49
|
+
s.synchronize do
|
50
|
+
s.gsub!('i', 'x')
|
51
|
+
s.slice!(0, 5)
|
52
|
+
end
|
53
|
+
|
39
54
|
== Note on Patches/Pull Requests
|
40
55
|
|
41
56
|
* Fork the project.
|
data/lib/synchronizable.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'monitor'
|
2
2
|
require 'synchronizable/version'
|
3
3
|
|
4
4
|
# Synchronizable is intended to be injected into objects via Object#extend.
|
@@ -20,11 +20,19 @@ module Synchronizable
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
# define synchronize method that executes a block
|
25
|
+
# protected with the internal instance lock
|
26
|
+
obj.define_singleton_method(:synchronize) do |&block|
|
27
|
+
__lock.synchronize(&block)
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
private
|
26
32
|
|
27
33
|
def __lock
|
28
|
-
|
34
|
+
# Monitor is used instead of Mutex in order to support
|
35
|
+
# re-entrant locking
|
36
|
+
@__lock ||= Monitor.new
|
29
37
|
end
|
30
38
|
end
|
@@ -35,5 +35,31 @@ describe Synchronizable do
|
|
35
35
|
object.size
|
36
36
|
lock.sync_invoked.should == true
|
37
37
|
end
|
38
|
+
|
39
|
+
it "allows re-entrant methods" do
|
40
|
+
class Test
|
41
|
+
def m1
|
42
|
+
10
|
43
|
+
end
|
44
|
+
|
45
|
+
def m2
|
46
|
+
m1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
t = Test.new
|
51
|
+
t.extend(Synchronizable)
|
52
|
+
t.m2.should == 10
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "protects a block via #synchronize" do
|
57
|
+
s = ""
|
58
|
+
s.methods.should_not include(:synchronize)
|
59
|
+
s.extend(Synchronizable)
|
60
|
+
s.methods.should include(:synchronize)
|
61
|
+
s.synchronize do
|
62
|
+
s.split
|
63
|
+
end
|
38
64
|
end
|
39
65
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ryan LeCompte
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-07-
|
17
|
+
date: 2011-07-29 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|