process_shared 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 +3 -2
- data/ext/libpsem/extconf.rb +7 -3
- data/ext/libpsem/psem.h +2 -0
- data/lib/process_shared.rb +19 -0
- data/lib/process_shared/define_singleton_method.rb +14 -0
- data/lib/process_shared/libpsem.so +0 -0
- data/lib/process_shared/mutex.rb +6 -1
- data/spec/process_shared/mutex_spec.rb +8 -0
- data/spec/spec_helper.rb +3 -0
- metadata +83 -53
data/README.rdoc
CHANGED
@@ -4,8 +4,9 @@ Concurrency primitives that may be used in a cross-process way to
|
|
4
4
|
coordinate share memory between processes.
|
5
5
|
|
6
6
|
A small C library (libpsem) is compiled to provide portable access to
|
7
|
-
semaphores. This library
|
8
|
-
|
7
|
+
semaphores (based on http://pyprocessing.berlios.de/). This library
|
8
|
+
is then accessed using FFI to implement Ruby classes
|
9
|
+
ProcessShared::Semaphore, ProcessShared::BoundedSemaphore,
|
9
10
|
ProcessShared::Mutex, and ProcessShared::SharedMemory.
|
10
11
|
|
11
12
|
This is an incomplete work in progress.
|
data/ext/libpsem/extconf.rb
CHANGED
@@ -3,7 +3,8 @@ require 'mkmf'
|
|
3
3
|
$objs = []
|
4
4
|
|
5
5
|
# posix semaphores
|
6
|
-
if have_func('sem_open', 'semaphore.h')
|
6
|
+
if have_func('sem_open', 'semaphore.h') ||
|
7
|
+
($libs << '-lpthread' && have_func('sem_open', 'semaphore.h'))
|
7
8
|
have_func('floorf', 'math.h') or abort("Missing required floorf() in math.h")
|
8
9
|
have_library('m', 'floorf')
|
9
10
|
|
@@ -12,12 +13,15 @@ if have_func('sem_open', 'semaphore.h')
|
|
12
13
|
end
|
13
14
|
|
14
15
|
have_library('rt', 'sem_open')
|
16
|
+
else
|
17
|
+
abort('Win32 or platform without sem_open not supported (yet?)')
|
15
18
|
end
|
16
19
|
|
17
20
|
c_sources = ['psem.c', 'psem_error.c', 'psem_posix.c', 'bsem.c', 'constants.c']
|
18
21
|
$objs += ['psem.o', 'psem_error.o', 'bsem.o', 'constants.o']
|
19
22
|
|
20
|
-
depend_rules
|
23
|
+
if respond_to? :depend_rules
|
24
|
+
depend_rules <<-END
|
21
25
|
psem.c: psem.h psem_posix.c
|
22
26
|
psem_error.c: psem_error.h
|
23
27
|
|
@@ -31,6 +35,6 @@ mempcpy.c: mempcpy.h
|
|
31
35
|
|
32
36
|
libpsem.o: #{$objs.join(' ')}
|
33
37
|
END
|
34
|
-
|
38
|
+
end
|
35
39
|
|
36
40
|
create_makefile('libpsem')
|
data/ext/libpsem/psem.h
CHANGED
data/lib/process_shared.rb
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
require 'ffi'
|
2
2
|
|
3
|
+
if VERSION =~ /^1.8/
|
4
|
+
require 'process_shared/define_singleton_method'
|
5
|
+
|
6
|
+
module ProcessShared
|
7
|
+
module PSem
|
8
|
+
extend DefineSingletonMethod
|
9
|
+
end
|
10
|
+
|
11
|
+
module RT
|
12
|
+
extend DefineSingletonMethod
|
13
|
+
end
|
14
|
+
|
15
|
+
module LibC
|
16
|
+
extend DefineSingletonMethod
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
3
21
|
require 'process_shared/semaphore'
|
4
22
|
require 'process_shared/bounded_semaphore'
|
5
23
|
require 'process_shared/mutex'
|
6
24
|
require 'process_shared/shared_memory'
|
25
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module ProcessShared
|
2
|
+
module DefineSingletonMethod
|
3
|
+
# This method was added in Ruby 1.9.x. Include this module for
|
4
|
+
# backwards compatibility.
|
5
|
+
#
|
6
|
+
# This isn't exactly compatible with the method in 1.9 which can
|
7
|
+
# take a Proc, Method, or a block. This only accepts a block.
|
8
|
+
def define_singleton_method(sym, &block)
|
9
|
+
eigenclass = class << self; self; end
|
10
|
+
eigenclass.send(:define_method, sym, &block)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
Binary file
|
data/lib/process_shared/mutex.rb
CHANGED
@@ -20,6 +20,10 @@ module ProcessShared
|
|
20
20
|
|
21
21
|
# @return [Mutex]
|
22
22
|
def lock
|
23
|
+
if locked_by == ::Process.pid
|
24
|
+
raise ProcessError, "already locked by this process #{::Process.pid}"
|
25
|
+
end
|
26
|
+
|
23
27
|
@sem.wait
|
24
28
|
self.locked_by = ::Process.pid
|
25
29
|
self
|
@@ -37,7 +41,7 @@ module ProcessShared
|
|
37
41
|
def sleep(timeout = nil)
|
38
42
|
unlock
|
39
43
|
begin
|
40
|
-
timeout ? sleep(timeout) : sleep
|
44
|
+
timeout ? Kernel.sleep(timeout) : Kernel.sleep
|
41
45
|
ensure
|
42
46
|
lock
|
43
47
|
end
|
@@ -62,6 +66,7 @@ module ProcessShared
|
|
62
66
|
raise ProcessError, "lock is held by #{p} not #{::Process.pid}"
|
63
67
|
end
|
64
68
|
|
69
|
+
self.locked_by = 0
|
65
70
|
@sem.post
|
66
71
|
self
|
67
72
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
+
require 'rubygems' if VERSION =~ /^1.8/
|
1
2
|
gem 'minitest'
|
2
3
|
require 'minitest/spec'
|
3
4
|
require 'minitest/autorun'
|
4
5
|
require 'minitest/matchers'
|
5
6
|
|
7
|
+
require 'process_shared'
|
8
|
+
|
6
9
|
class RangeMatcher
|
7
10
|
def initialize(operator, limit)
|
8
11
|
@operator = operator.to_sym
|
metadata
CHANGED
@@ -1,72 +1,91 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: process_shared
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Patrick Mahoney
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2011-12-13 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: ffi
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
25
|
+
requirements:
|
19
26
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 0
|
32
|
+
version: "1.0"
|
22
33
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
26
36
|
name: rake-compiler
|
27
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
33
47
|
type: :development
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
37
50
|
name: minitest
|
38
|
-
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
53
|
none: false
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
44
61
|
type: :development
|
45
|
-
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
48
64
|
name: minitest-matchers
|
49
|
-
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
67
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
55
75
|
type: :development
|
56
|
-
|
57
|
-
|
58
|
-
description: FFI wrapper around portable semaphore library with mutex and condition
|
59
|
-
vars built on top.
|
76
|
+
version_requirements: *id004
|
77
|
+
description: FFI wrapper around portable semaphore library with mutex and condition vars built on top.
|
60
78
|
email: pat@polycrystal.org
|
61
79
|
executables: []
|
62
|
-
|
80
|
+
|
81
|
+
extensions:
|
63
82
|
- ext/pthread_sync_helper/extconf.rb
|
64
83
|
- ext/libpsem/extconf.rb
|
65
|
-
extra_rdoc_files:
|
84
|
+
extra_rdoc_files:
|
66
85
|
- README.rdoc
|
67
86
|
- ChangeLog
|
68
87
|
- COPYING
|
69
|
-
files:
|
88
|
+
files:
|
70
89
|
- lib/scratch.rb
|
71
90
|
- lib/process_shared.rb
|
72
91
|
- lib/process_shared/abstract_semaphore.rb
|
@@ -78,6 +97,7 @@ files:
|
|
78
97
|
- lib/process_shared/rt.rb
|
79
98
|
- lib/process_shared/psem.rb
|
80
99
|
- lib/process_shared/with_self.rb
|
100
|
+
- lib/process_shared/define_singleton_method.rb
|
81
101
|
- lib/process_shared/condition_variable.rb
|
82
102
|
- lib/process_shared/bounded_semaphore.rb
|
83
103
|
- lib/process_shared/libc.rb
|
@@ -114,26 +134,36 @@ files:
|
|
114
134
|
- COPYING
|
115
135
|
homepage: https://github.com/pmahoney/process_shared
|
116
136
|
licenses: []
|
137
|
+
|
117
138
|
post_install_message:
|
118
139
|
rdoc_options: []
|
119
|
-
|
140
|
+
|
141
|
+
require_paths:
|
120
142
|
- lib
|
121
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
144
|
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
version: "0"
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
153
|
none: false
|
129
|
-
requirements:
|
130
|
-
- -
|
131
|
-
- !ruby/object:Gem::Version
|
132
|
-
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
133
161
|
requirements: []
|
162
|
+
|
134
163
|
rubyforge_project:
|
135
164
|
rubygems_version: 1.8.10
|
136
165
|
signing_key:
|
137
166
|
specification_version: 3
|
138
167
|
summary: process-shared synchronization primitives
|
139
168
|
test_files: []
|
169
|
+
|