process_shared 0.0.2 → 0.0.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.
@@ -1,6 +1,6 @@
1
1
  require 'ffi'
2
2
 
3
- if VERSION =~ /^1.8/
3
+ if RUBY_VERSION =~ /^1.8/
4
4
  require 'process_shared/define_singleton_method'
5
5
 
6
6
  module ProcessShared
@@ -2,6 +2,9 @@ require 'process_shared/psem'
2
2
  require 'process_shared/semaphore'
3
3
 
4
4
  module ProcessShared
5
+ # BoundedSemaphore is identical to Semaphore except that its value
6
+ # is not permitted to rise above a maximum. When the value is at
7
+ # the maximum, calls to #post will have no effect.
5
8
  class BoundedSemaphore < Semaphore
6
9
  # With no associated block, open is a synonym for
7
10
  # Semaphore.new. If the optional code block is given, it will be
@@ -4,12 +4,27 @@ require 'process_shared/shared_memory'
4
4
  require 'process_shared/process_error'
5
5
 
6
6
  module ProcessShared
7
+ # This Mutex class is implemented as a BoundedSemaphore with a
8
+ # maximum value of 1. Additionally, the locking process is tracked,
9
+ # and ProcessError is raised if either #unlock is called by a
10
+ # process different from the locking process, or if #lock is called
11
+ # while the process already holds the lock (i.e. the mutex is not
12
+ # re-entrant). This tracking is not without performance cost, of
13
+ # course (current implementation uses an additional BoundedSemaphore
14
+ # and SharedMemory segment).
15
+ #
16
+ # The API is intended to be identical to the ::Mutex in the core
17
+ # Ruby library.
18
+ #
19
+ # TODO: the core Ruby api has no #close method, but this Mutex must
20
+ # release its BoundedSemaphore and SharedMemory resources. For now,
21
+ # we rely on the object finalizers of those objects...
7
22
  class Mutex
8
- include WithSelf
23
+ # include WithSelf
9
24
 
10
- def self.open(&block)
11
- new.with_self(&block)
12
- end
25
+ # def self.open(&block)
26
+ # new.with_self(&block)
27
+ # end
13
28
 
14
29
  def initialize
15
30
  @internal_sem = BoundedSemaphore.new(1)
@@ -73,6 +88,8 @@ module ProcessShared
73
88
 
74
89
  # Acquire the lock, yield the block, then ensure the lock is
75
90
  # unlocked.
91
+ #
92
+ # @return [Object] the result of the block
76
93
  def synchronize
77
94
  lock
78
95
  begin
@@ -44,7 +44,8 @@ module ProcessShared
44
44
  psem_post(sem, err)
45
45
  end
46
46
 
47
- # Get the current value of the semaphore.
47
+ # Get the current value of the semaphore. Raises Errno::NOTSUP on
48
+ # platforms that don't support this (e.g. Mac OS X).
48
49
  #
49
50
  # @return [Integer] the current value of the semaphore.
50
51
  def value
@@ -53,6 +54,11 @@ module ProcessShared
53
54
  int.get_int(0)
54
55
  end
55
56
 
57
+ # Release the resources associated with this semaphore. Calls to
58
+ # other methods are undefined after #close has been called.
59
+ #
60
+ # Close must be called when the semaphore is no longer needed. An
61
+ # object finalizer will close the semaphore as a last resort.
56
62
  def close
57
63
  psem_close(sem, err)
58
64
  end
@@ -1,4 +1,4 @@
1
- require 'rubygems' if VERSION =~ /^1.8/
1
+ require 'rubygems' if RUBY_VERSION =~ /^1.8/
2
2
  gem 'minitest'
3
3
  require 'minitest/spec'
4
4
  require 'minitest/autorun'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: process_shared
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Patrick Mahoney