mongoid-semaphore 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/mongoid/lock/synch_methods.rb +49 -0
- data/lib/mongoid/lock.rb +24 -0
- data/lib/mongoid/semaphore/sync_methods.rb +21 -14
- data/lib/mongoid/semaphore.rb +0 -8
- data/lib/mongoid-semaphore.rb +2 -0
- data/mongoid-semaphore.gemspec +3 -1
- metadata +14 -12
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.6
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Lock
|
5
|
+
|
6
|
+
def reset_lock!
|
7
|
+
self.update_attributes!({:sema_count => __semaphore_initial_count, :used_by => nil})
|
8
|
+
end
|
9
|
+
|
10
|
+
def lock_acquire
|
11
|
+
self.sema_down
|
12
|
+
if (self.sema_ready?)
|
13
|
+
self.set(:used_by, "#{Socket.hostname}:#{Process.pid}")
|
14
|
+
else
|
15
|
+
self.sema_up
|
16
|
+
raise Mongoid::Semaphore::UnsynchronizedAccess.new(self.sema_count, "Lock in Use! (#{self.used_by})")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def lock_release
|
21
|
+
if (self.used_by == "#{Socket.hostname}:#{Process.pid}")
|
22
|
+
self.sema_up
|
23
|
+
self.set(:used_by, nil)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def synchronized(&block)
|
29
|
+
self.lock_acquire
|
30
|
+
begin
|
31
|
+
block.call()
|
32
|
+
ensure
|
33
|
+
self.lock_release
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def try_synchronized(&try_block)
|
38
|
+
return false unless self.sema_ready?
|
39
|
+
begin
|
40
|
+
self.synchronized do
|
41
|
+
try_block.call()
|
42
|
+
end
|
43
|
+
return true
|
44
|
+
rescue Mongoid::Semaphore::UnsynchronizedAccess => ua
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/mongoid/lock.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'mongoid/semaphore'
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
module Lock
|
5
|
+
extends Mongoid::Semaphore
|
6
|
+
|
7
|
+
# => Volatile Access, Reload to Ensure state
|
8
|
+
def used_by
|
9
|
+
self.save
|
10
|
+
self.reload
|
11
|
+
return super
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.included(base)
|
15
|
+
base.class_eval do
|
16
|
+
include Mongoid::Semaphore
|
17
|
+
default_sema_count 1
|
18
|
+
field :used_by, :type => String, :default => nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'mongoid/lock/synch_methods'
|
@@ -1,31 +1,38 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
1
|
module Mongoid
|
4
2
|
module Semaphore
|
5
3
|
def reset_semaphore!
|
6
|
-
self.update_attributes!({:sema_count =>
|
4
|
+
self.update_attributes!({:sema_count => __semaphore_initial_count})
|
5
|
+
end
|
6
|
+
|
7
|
+
def sema_up
|
8
|
+
self.inc(:sema_count, 1)
|
9
|
+
end
|
10
|
+
|
11
|
+
def sema_down
|
12
|
+
self.dec(:sema_count, 1)
|
13
|
+
end
|
14
|
+
|
15
|
+
def sema_ready?
|
16
|
+
self.save()
|
17
|
+
self.reload()
|
18
|
+
return (self.sema_count >= 0)
|
7
19
|
end
|
8
20
|
|
9
21
|
def synchronized(&block)
|
10
22
|
begin
|
11
|
-
self.
|
12
|
-
if (self.
|
13
|
-
|
14
|
-
self.set(:used_by, "#{Socket.gethostname}:#{Process.pid}")
|
15
|
-
block.call(self)
|
16
|
-
ensure
|
17
|
-
self.set(:used_by, nil)
|
18
|
-
end
|
23
|
+
self.sema_down
|
24
|
+
if (self.sema_ready?)
|
25
|
+
block.call()
|
19
26
|
else
|
20
|
-
raise Mongoid::Semaphore::UnsynchronizedAccess.new(self.sema_count
|
27
|
+
raise Mongoid::Semaphore::UnsynchronizedAccess.new(self.sema_count)
|
21
28
|
end
|
22
29
|
ensure
|
23
|
-
self.
|
30
|
+
self.sema_up
|
24
31
|
end
|
25
32
|
end
|
26
33
|
|
27
34
|
def try_synchronized(&try_block)
|
28
|
-
return false unless self.
|
35
|
+
return false unless self.sema_ready?
|
29
36
|
begin
|
30
37
|
self.synchronized do
|
31
38
|
try_block.call()
|
data/lib/mongoid/semaphore.rb
CHANGED
@@ -23,12 +23,6 @@ module Mongoid
|
|
23
23
|
self.reload
|
24
24
|
return super
|
25
25
|
end
|
26
|
-
# => Volatile Value, Refresh Before Returning
|
27
|
-
def used_by
|
28
|
-
self.save()
|
29
|
-
self.reload
|
30
|
-
return super
|
31
|
-
end
|
32
26
|
#------------------------------------------------------------------------------
|
33
27
|
# => Inclusion hook. Adds fields, and default attributes
|
34
28
|
#------------------------------------------------------------------------------
|
@@ -42,8 +36,6 @@ module Mongoid
|
|
42
36
|
base.extend(Mongoid::Semaphore::ClassMethods)
|
43
37
|
# => Semaphore Counter
|
44
38
|
field :sema_count, :type => Integer, :default => lambda { __semaphore_initial_count }
|
45
|
-
# => Semaphore is currently held by "<hostname>:<pid>" || nil
|
46
|
-
field :used_by, :type => String, :default => nil
|
47
39
|
end
|
48
40
|
end
|
49
41
|
end
|
data/lib/mongoid-semaphore.rb
CHANGED
@@ -6,10 +6,12 @@ if (defined?(Rails) and Rails.version.to_i > 3)
|
|
6
6
|
railtie_name :"mongoid-semaphore"
|
7
7
|
initializer "mongoid-semaphore.load_dependencies" do
|
8
8
|
require 'mongoid/semaphore'
|
9
|
+
require 'mongoid/lock'
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
13
14
|
else
|
14
15
|
require 'mongoid/semaphore'
|
16
|
+
require 'mongoid/lock'
|
15
17
|
end
|
data/mongoid-semaphore.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "mongoid-semaphore"
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.6"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["James Petty"]
|
@@ -24,6 +24,8 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
26
|
"lib/mongoid-semaphore.rb",
|
27
|
+
"lib/mongoid/lock.rb",
|
28
|
+
"lib/mongoid/lock/synch_methods.rb",
|
27
29
|
"lib/mongoid/semaphore.rb",
|
28
30
|
"lib/mongoid/semaphore/class_methods.rb",
|
29
31
|
"lib/mongoid/semaphore/sync_methods.rb",
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongoid-semaphore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-03-26 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mongoid
|
16
|
-
requirement: &
|
16
|
+
requirement: &15839100 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15839100
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: shoulda
|
27
|
-
requirement: &
|
27
|
+
requirement: &15838160 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15838160
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &15835940 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15835940
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &15834320 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.6.4
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *15834320
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rcov
|
60
|
-
requirement: &
|
60
|
+
requirement: &15832960 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *15832960
|
69
69
|
description: Adds Semaphore-like behaviors to a Mongoid::Document instance
|
70
70
|
email: jp@jibe.com
|
71
71
|
executables: []
|
@@ -81,6 +81,8 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- VERSION
|
83
83
|
- lib/mongoid-semaphore.rb
|
84
|
+
- lib/mongoid/lock.rb
|
85
|
+
- lib/mongoid/lock/synch_methods.rb
|
84
86
|
- lib/mongoid/semaphore.rb
|
85
87
|
- lib/mongoid/semaphore/class_methods.rb
|
86
88
|
- lib/mongoid/semaphore/sync_methods.rb
|
@@ -102,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
104
|
version: '0'
|
103
105
|
segments:
|
104
106
|
- 0
|
105
|
-
hash:
|
107
|
+
hash: 1476559913060575075
|
106
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
109
|
none: false
|
108
110
|
requirements:
|