win32-job 0.1.1 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b05ef073cbab8e2e228f1bbe4dc4691d42d7e161
4
- data.tar.gz: e8b44cab6624612b066f785e9895851384c3e963
3
+ metadata.gz: 0c046b91579b8ce36811d85d9dcf691e2c3ff555
4
+ data.tar.gz: 4e65f2fe4f2ded16f6a43c0cf672bab7fa5da91c
5
5
  SHA512:
6
- metadata.gz: ad0a9b6601e876eb373e710fa900d2033ff45e2ab06a5dc1f18438ecf2dd9a71fff549e4eeb621a1c8c82d23bbed258d9c5aba8845d2732187e0f8604055dfe1
7
- data.tar.gz: 977ff9aadaa433efa20a15637f51bdf13c2b2e72aea844543cf9a5aed99d43c2343d6a52145d7a883830be18729db76d86a7ed31c791dcdfa69ba826f9c05e09
6
+ metadata.gz: 73df699846e40e26e1bcaebcae9adc5301d2da6a336aafec73f08907a225955751c858098447601aad3f0bbd8967d2cb942bb149ec693da6953f2857c382644f
7
+ data.tar.gz: fad7d536c6fc5b1a3ca3f9326b5386c7ca54407b1f0d399a37f0f115e276e6b419dbada1f9d1dba71a588cf8c6c40aac6284b83596b576b598f6d8860df466ea
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ = 0.1.2 - 6-Feb-2014
2
+ * Altered the constructor. The second argument now controls whether or not
3
+ to raise an error if the job already exists. By default it will open the job
4
+ if it already exists.
5
+ * Fixed a bug in the process_list method where it could return incorrect values.
6
+
1
7
  = 0.1.1 - 5-Feb-2014
2
8
  * Added a wait method.
3
9
 
data/lib/win32/job.rb CHANGED
@@ -14,7 +14,7 @@ module Win32
14
14
  extend Windows::Functions
15
15
 
16
16
  # The version of the win32-job library
17
- VERSION = '0.1.1'
17
+ VERSION = '0.1.2'
18
18
 
19
19
  private
20
20
 
@@ -41,6 +41,7 @@ module Win32
41
41
 
42
42
  public
43
43
 
44
+ # The name of the job, if specified.
44
45
  attr_reader :job_name
45
46
 
46
47
  alias :name :job_name
@@ -48,11 +49,14 @@ module Win32
48
49
  # Create a new Job object identified by +name+. If no name is provided
49
50
  # then an anonymous job is created.
50
51
  #
51
- # If the +kill_on_close+ argument is true, all associated processes are
52
- # terminated and the job object then destroys itself. Otherwise, the job
53
- # object will not be destroyed until all associated processes have exited.
52
+ # If the job already exists then the existing job is opened instead, unless
53
+ # the +open_existing+ method is false. In that case an error is
54
+ # raised.
54
55
  #
55
- def initialize(name = nil, security = nil)
56
+ # The +security+ argument accepts a raw SECURITY_ATTRIBUTES struct that is
57
+ # passed to the CreateJobObject function internally.
58
+ #
59
+ def initialize(name = nil, open_existing = true, security = nil)
56
60
  raise TypeError unless name.is_a?(String) if name
57
61
 
58
62
  @job_name = name
@@ -65,6 +69,10 @@ module Win32
65
69
  FFI.raise_windows_error('CreateJobObject', FFI.errno)
66
70
  end
67
71
 
72
+ if FFI.errno == ERROR_ALREADY_EXISTS && !open_existing
73
+ raise ArgumentError, "job '#{name}' already exists"
74
+ end
75
+
68
76
  if block_given?
69
77
  begin
70
78
  yield self
@@ -79,6 +87,12 @@ module Win32
79
87
  # Add process +pid+ to the job object. Process ID's added to the
80
88
  # job are tracked via the Job#process_list accessor.
81
89
  #
90
+ # Note that once a process is added to a job, the association cannot be
91
+ # broken. A process can be associated with more than one job in a
92
+ # hierarchy of nested jobs, however.
93
+ #
94
+ # You may add a maximum of 100 processes per job.
95
+ #
82
96
  def add_process(pid)
83
97
  if @process_list.size > 99
84
98
  raise ArgumentError, "maximum number of processes reached"
@@ -116,6 +130,8 @@ module Win32
116
130
  # Kill all processes associated with the job object that are
117
131
  # associated with the current process.
118
132
  #
133
+ # Note that killing a process does not dissociate it from the job.
134
+ #
119
135
  def kill
120
136
  unless TerminateJobObject(@job_handle, Process.pid)
121
137
  FFI.raise_windows_error('TerminateJobObject', FFI.errno)
@@ -360,7 +376,7 @@ module Win32
360
376
  FFI.raise_windows_error('QueryInformationJobObject', FFI.errno)
361
377
  end
362
378
 
363
- info[:ProcessIdList].to_a.select{ |n| n != 0 }
379
+ info[:ProcessIdList].to_a[0...info[:NumberOfProcessIdsInList]]
364
380
  end
365
381
 
366
382
  # Returns an AccountInfoStruct that shows various job accounting
@@ -27,6 +27,7 @@ module Windows
27
27
  INFINITE = 0xFFFFFFFF
28
28
 
29
29
  INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
30
+ ERROR_ALREADY_EXISTS = 183
30
31
 
31
32
  JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008
32
33
  JOB_OBJECT_LIMIT_AFFINITY = 0x00000010
@@ -15,7 +15,7 @@ class TC_Win32_Job < Test::Unit::TestCase
15
15
  end
16
16
 
17
17
  test "version number is what we expect" do
18
- assert_equal('0.1.1', Win32::Job::VERSION)
18
+ assert_equal('0.1.2', Win32::Job::VERSION)
19
19
  end
20
20
 
21
21
  test "constructor argument may be omitted" do
@@ -26,10 +26,19 @@ class TC_Win32_Job < Test::Unit::TestCase
26
26
  assert_nothing_raised{ Win32::Job.new(@name) }
27
27
  end
28
28
 
29
+ test "constructor accepts a second argument" do
30
+ assert_nothing_raised{ Win32::Job.new(@name, true) }
31
+ end
32
+
29
33
  test "argument to constructor must be a string" do
30
34
  assert_raise(TypeError){ Win32::Job.new(1) }
31
35
  end
32
36
 
37
+ test "if second argument to constructor is false, an error is raised if the same job is reopened" do
38
+ @job = Win32::Job.new('test')
39
+ assert_raise(ArgumentError){ Win32::Job.new('test', false) }
40
+ end
41
+
33
42
  test "job_name basic functionality" do
34
43
  assert_respond_to(@job, :job_name)
35
44
  assert_nothing_raised{ @job.job_name }
data/win32-job.gemspec CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'win32-job'
5
- spec.version = '0.1.1'
5
+ spec.version = '0.1.2'
6
6
  spec.authors = ['Daniel J. Berger', 'Park Heesob']
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.email = 'djberg96@gmail.com'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-05 00:00:00.000000000 Z
12
+ date: 2014-02-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
97
  version: '0'
98
98
  requirements: []
99
99
  rubyforge_project: win32utils
100
- rubygems_version: 2.2.1
100
+ rubygems_version: 2.2.2
101
101
  signing_key:
102
102
  specification_version: 4
103
103
  summary: Interface for Windows jobs (process groups)