win32-mutex 0.3.0
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/CHANGES +33 -0
- data/MANIFEST +8 -0
- data/README +52 -0
- data/Rakefile +26 -0
- data/lib/win32/mutex.rb +124 -0
- data/test/tc_mutex.rb +61 -0
- data/win32-mutex.gemspec +24 -0
- metadata +67 -0
data/CHANGES
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
== 0.3.0 - 4-May-2007
|
2
|
+
* Now pure Ruby.
|
3
|
+
* Both the Mutex.new and Mutex.open methods now accept a block, and
|
4
|
+
automatically close the associated handle at the end of the block.
|
5
|
+
* The Mutex.new method now accepts an optional third argument that controls
|
6
|
+
whether the mutex object can be inherited by other processes.
|
7
|
+
* Added a gemspec.
|
8
|
+
* Added a Rakefile, including tasks for installation and testing.
|
9
|
+
* Removed the doc/mutext.txt file. The documentation is now inlined via RDoc.
|
10
|
+
There is also some documentation in the README file.
|
11
|
+
* The mutex_test.rb script was updated and bugs were fixed.
|
12
|
+
* Now requires the windows-pr package.
|
13
|
+
|
14
|
+
== 0.2.2 - 29-May-2005
|
15
|
+
* Now Unicode friendly.
|
16
|
+
* Removed the mutex.rd file. The mutex.txt file is now rdoc friendly.
|
17
|
+
* Added some tests and tweaked the test setup.
|
18
|
+
|
19
|
+
== 0.2.1 - 1-Mar-2005
|
20
|
+
* Moved the 'examples' directory to the toplevel directory.
|
21
|
+
* Made the CHANGES and README files rdoc friendly.
|
22
|
+
|
23
|
+
== 0.2.0 - 18-Jul-2004
|
24
|
+
* Updated to use the newer allocation framework. This means that, as of this
|
25
|
+
release, this package requires Ruby 1.8.0 or later.
|
26
|
+
* Fixed a minor bug in the initialization function where an expected error
|
27
|
+
might not be raised.
|
28
|
+
* Added tests and documentation for Mutex.open(). This was in the last
|
29
|
+
version, but I forgot to document or test it.
|
30
|
+
* Moved the test.rb script to doc/examples
|
31
|
+
|
32
|
+
== 0.1.0 - 3-May-2004
|
33
|
+
* Initial release
|
data/MANIFEST
ADDED
data/README
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
== Brief Description
|
2
|
+
Interface for Mutexes on MS Windows.
|
3
|
+
|
4
|
+
== Prerequisites
|
5
|
+
win32-ipc 0.5.0 or later
|
6
|
+
|
7
|
+
== Installation
|
8
|
+
rake test (optional)
|
9
|
+
rake install
|
10
|
+
|
11
|
+
== Synopsis
|
12
|
+
require 'win32/mutex'
|
13
|
+
|
14
|
+
# Do not leave out the 'Win32::', otherwise you're using Ruby's Mutex class.
|
15
|
+
Win32::Mutex.new(false, 'test') do |m|
|
16
|
+
# Do stuff
|
17
|
+
m.release
|
18
|
+
end
|
19
|
+
|
20
|
+
== Documentation
|
21
|
+
The mutex.rb file contains inline RDoc documentation. If you installed
|
22
|
+
this file as a gem, then you have the docs.
|
23
|
+
|
24
|
+
For an example of win32-mutex in action, look at the mutex_test.rb file
|
25
|
+
in the 'examples' directory. You can also run the 'examples' rake task.
|
26
|
+
|
27
|
+
== Notes
|
28
|
+
The Mutex class is a subclass of Win32::Ipc (win32-ipc). This package
|
29
|
+
require's the win32-ipc package internally (you don't need to explicitly
|
30
|
+
call it).
|
31
|
+
|
32
|
+
== Acknowledgements
|
33
|
+
Originally adapted from the Win32::Mutex Perl module.
|
34
|
+
|
35
|
+
== Known Bugs
|
36
|
+
None that I know of. Please log any other bug reports on the RubyForge
|
37
|
+
project page at http://www.rubyforge.net/projects/win32utils
|
38
|
+
|
39
|
+
== License
|
40
|
+
Ruby's
|
41
|
+
|
42
|
+
== Copyright
|
43
|
+
(C) 2003-2007 Daniel J. Berger, All Rights Reserved
|
44
|
+
|
45
|
+
== Warranty
|
46
|
+
This package is provided "as is" and without any express or
|
47
|
+
implied warranties, including, without limitation, the implied
|
48
|
+
warranties of merchantability and fitness for a particular purpose.
|
49
|
+
|
50
|
+
== Authors
|
51
|
+
Daniel J. Berger
|
52
|
+
Park Heesob
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rbconfig'
|
4
|
+
include Config
|
5
|
+
|
6
|
+
desc 'Install the win32-mutex package (non-gem)'
|
7
|
+
task :install do
|
8
|
+
sitelibdir = CONFIG['sitelibdir']
|
9
|
+
installdir = File.join(sitelibdir, 'win32')
|
10
|
+
file = 'lib\win32\mutex.rb'
|
11
|
+
|
12
|
+
Dir.mkdir(installdir) unless File.exists?(installdir)
|
13
|
+
FileUtils.cp(file, installdir, :verbose => true)
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Run the example program'
|
17
|
+
task :example do
|
18
|
+
ruby '-Ilib examples/mutex_test.rb'
|
19
|
+
end
|
20
|
+
|
21
|
+
Rake::TestTask.new do |t|
|
22
|
+
t.libs << 'test'
|
23
|
+
t.verbose = true
|
24
|
+
t.warning = true
|
25
|
+
t.test_files = FileList['test/tc_mutex.rb']
|
26
|
+
end
|
data/lib/win32/mutex.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'win32/ipc'
|
2
|
+
|
3
|
+
module Win32
|
4
|
+
class Mutex < Ipc
|
5
|
+
|
6
|
+
# This is the error raised if any of the Mutex methods fail.
|
7
|
+
class Error < StandardError; end
|
8
|
+
|
9
|
+
extend Windows::Synchronize
|
10
|
+
extend Windows::Error
|
11
|
+
extend Windows::Handle
|
12
|
+
|
13
|
+
VERSION = '0.3.0'
|
14
|
+
|
15
|
+
# The name of the Mutex object.
|
16
|
+
#
|
17
|
+
attr_reader :name
|
18
|
+
|
19
|
+
# Creates and returns new Mutex object. If +name+ is omitted, the
|
20
|
+
# Mutex object is created without a name, i.e. it's anonymous.
|
21
|
+
#
|
22
|
+
# If the +initial_owner+ value is true and the caller created the mutex,
|
23
|
+
# the calling thread obtains initial ownership of the mutex object.
|
24
|
+
# Otherwise, the calling thread does not obtain ownership of the mutex.
|
25
|
+
# This value is false by default.
|
26
|
+
#
|
27
|
+
# If +name+ is provided and it already exists, then it is opened
|
28
|
+
# instead, and the +initial_count+ and +max_count+ parameters are
|
29
|
+
# ignored.
|
30
|
+
#
|
31
|
+
# The +inherit+ attribute determines whether or not the mutex can
|
32
|
+
# be inherited by child processes.
|
33
|
+
#
|
34
|
+
def initialize(initial_owner=false, name=nil, inherit=true)
|
35
|
+
@initial_owner = initial_owner
|
36
|
+
@name = name
|
37
|
+
@inherit = inherit
|
38
|
+
|
39
|
+
# Used to prevent potential segfaults.
|
40
|
+
if name && !name.is_a?(String)
|
41
|
+
raise TypeError, 'name must be a string'
|
42
|
+
end
|
43
|
+
|
44
|
+
if inherit
|
45
|
+
sec = 0.chr * 12 # sizeof(SECURITY_ATTRIBUTES)
|
46
|
+
sec[0,4] = [12].pack('L')
|
47
|
+
sec[8,4] = [1].pack('L') # 1 == TRUE
|
48
|
+
else
|
49
|
+
sec = 0
|
50
|
+
end
|
51
|
+
|
52
|
+
initial = initial_owner ? 1 : 0
|
53
|
+
|
54
|
+
handle = CreateMutex(sec, initial, name)
|
55
|
+
|
56
|
+
if handle == 0 || handle == INVALID_HANDLE_VALUE
|
57
|
+
raise Error, get_last_error
|
58
|
+
end
|
59
|
+
|
60
|
+
super(handle)
|
61
|
+
|
62
|
+
if block_given?
|
63
|
+
begin
|
64
|
+
yield self
|
65
|
+
ensure
|
66
|
+
close
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Open an existing Mutex by +name+. The +inherit+ argument sets
|
72
|
+
# whether or not the object was opened such that a process created by the
|
73
|
+
# CreateProcess() function (a Windows API function) can inherit the
|
74
|
+
# handle. The default is true.
|
75
|
+
#
|
76
|
+
# This method is essentially identical to Mutex.new, except that the
|
77
|
+
# option for +initial_owner+ cannot be set (since it is already set).
|
78
|
+
# Also, this method will raise a Mutex::Error if the mutex doesn't
|
79
|
+
# already exist.
|
80
|
+
#
|
81
|
+
# If you want "open or create" semantics, then use Mutex.new.
|
82
|
+
#--
|
83
|
+
# The OpenMutex() call here is strictly to force an error if the user
|
84
|
+
# tries to open a mutex that doesn't already exist.
|
85
|
+
#
|
86
|
+
def self.open(name, inherit=true, &block)
|
87
|
+
if name && !name.is_a?(String)
|
88
|
+
raise TypeError, 'name must be a string'
|
89
|
+
end
|
90
|
+
|
91
|
+
bool = inherit ? 1 : 0
|
92
|
+
handle = OpenMutex(MUTEX_ALL_ACCESS, bool, name)
|
93
|
+
if handle == 0 || handle == INVALID_HANDLE_VALUE
|
94
|
+
raise Error, get_last_error
|
95
|
+
end
|
96
|
+
CloseHandle(handle)
|
97
|
+
|
98
|
+
self.new(false, name, inherit, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Releases ownership of the mutex.
|
102
|
+
#
|
103
|
+
def release
|
104
|
+
unless ReleaseMutex(@handle)
|
105
|
+
raise Error, get_last_error
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns whether or not the calling thread has initial ownership of
|
110
|
+
# the mutex object.
|
111
|
+
#
|
112
|
+
def initial_owner?
|
113
|
+
@initial_owner
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns whether or not the object was opened such that a process
|
117
|
+
# created by the CreateProcess() function (a Windows API function) can
|
118
|
+
# inherit the handle. The default is true.
|
119
|
+
#
|
120
|
+
def inheritable?
|
121
|
+
@inherit
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/test/tc_mutex.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#####################################################################
|
2
|
+
# tc_Win32::Mutex.rb
|
3
|
+
#
|
4
|
+
# Test suite for the win32-Win32::Mutex package. This test suite should
|
5
|
+
# be run via the 'rake test' task.
|
6
|
+
#####################################################################
|
7
|
+
require 'test/unit'
|
8
|
+
require 'win32/mutex'
|
9
|
+
|
10
|
+
class TC_Win32_Mutex < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
@mutex = Win32::Mutex.new(true, 'test')
|
13
|
+
@umutex = Win32::Mutex.new(false, "Ηελλας")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_version
|
17
|
+
assert_equal('0.3.0', Win32::Mutex::VERSION)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_open
|
21
|
+
assert_respond_to(Win32::Mutex, :open)
|
22
|
+
assert_nothing_raised{ Win32::Mutex.open("test"){} }
|
23
|
+
assert_nothing_raised{ Win32::Mutex.open("Ηελλας"){} }
|
24
|
+
assert_raises(Win32::Mutex::Error){ Win32::Mutex.open("bogus"){} }
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_release
|
28
|
+
assert_respond_to(@mutex, :release)
|
29
|
+
assert_nothing_raised{ @mutex.release }
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_initial_owner
|
33
|
+
assert_respond_to(@mutex, :initial_owner?)
|
34
|
+
assert_equal(true, @mutex.initial_owner?)
|
35
|
+
assert_equal(false, @umutex.initial_owner?)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_inheritable
|
39
|
+
assert_respond_to(@mutex, :inheritable?)
|
40
|
+
assert_equal(true, @mutex.inheritable?)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_wait
|
44
|
+
assert_respond_to(@mutex, :wait)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_wait_any
|
48
|
+
assert_respond_to(@mutex, :wait_any)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_wait_all
|
52
|
+
assert_respond_to(@mutex, :wait_all)
|
53
|
+
end
|
54
|
+
|
55
|
+
def teardown
|
56
|
+
@mutex.close
|
57
|
+
@umutex.close
|
58
|
+
@mutex = nil
|
59
|
+
@umutex = nil
|
60
|
+
end
|
61
|
+
end
|
data/win32-mutex.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
spec = Gem::Specification.new do |gem|
|
4
|
+
gem.name = "win32-mutex"
|
5
|
+
gem.version = "0.3.0"
|
6
|
+
gem.author = "Daniel J. Berger"
|
7
|
+
gem.email = "djberg96@gmail.com"
|
8
|
+
gem.homepage = "http://www.rubyforge.org/projects/win32utils"
|
9
|
+
gem.platform = Gem::Platform::RUBY
|
10
|
+
gem.summary = "Interface to MS Windows Mutex objects."
|
11
|
+
gem.description = "Interface to MS Windows Mutex objects."
|
12
|
+
gem.test_file = "test/tc_mutex.rb"
|
13
|
+
gem.has_rdoc = true
|
14
|
+
gem.files = Dir["lib/win32/*.rb"] + Dir["test/*"] + Dir["[A-Z]*"]
|
15
|
+
gem.files.reject! { |fn| fn.include? "CVS" }
|
16
|
+
gem.require_path = "lib"
|
17
|
+
gem.extra_rdoc_files = ["README", "CHANGES", "MANIFEST"]
|
18
|
+
gem.add_dependency("win32-ipc", ">= 0.5.0")
|
19
|
+
end
|
20
|
+
|
21
|
+
if $0 == __FILE__
|
22
|
+
Gem.manage_gems
|
23
|
+
Gem::Builder.new(spec).build
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.9.2
|
3
|
+
specification_version: 1
|
4
|
+
name: win32-mutex
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: 0.3.0
|
7
|
+
date: 2007-05-04 00:00:00 -06:00
|
8
|
+
summary: Interface to MS Windows Mutex objects.
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email: djberg96@gmail.com
|
12
|
+
homepage: http://www.rubyforge.org/projects/win32utils
|
13
|
+
rubyforge_project:
|
14
|
+
description: Interface to MS Windows Mutex objects.
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
29
|
+
authors:
|
30
|
+
- Daniel J. Berger
|
31
|
+
files:
|
32
|
+
- lib/win32/mutex.rb
|
33
|
+
- test/CVS
|
34
|
+
- test/tc_mutex.rb
|
35
|
+
- CHANGES
|
36
|
+
- CVS
|
37
|
+
- examples
|
38
|
+
- lib
|
39
|
+
- MANIFEST
|
40
|
+
- Rakefile
|
41
|
+
- README
|
42
|
+
- test
|
43
|
+
- win32-mutex.gemspec
|
44
|
+
test_files:
|
45
|
+
- test/tc_mutex.rb
|
46
|
+
rdoc_options: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- README
|
50
|
+
- CHANGES
|
51
|
+
- MANIFEST
|
52
|
+
executables: []
|
53
|
+
|
54
|
+
extensions: []
|
55
|
+
|
56
|
+
requirements: []
|
57
|
+
|
58
|
+
dependencies:
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: win32-ipc
|
61
|
+
version_requirement:
|
62
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.5.0
|
67
|
+
version:
|