win32-job 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c046b91579b8ce36811d85d9dcf691e2c3ff555
4
- data.tar.gz: 4e65f2fe4f2ded16f6a43c0cf672bab7fa5da91c
3
+ metadata.gz: af2229e6e9b4045eeee68046c86d250744c3e92c
4
+ data.tar.gz: a3f7373165c4826a3762424aacd85665bcd7da19
5
5
  SHA512:
6
- metadata.gz: 73df699846e40e26e1bcaebcae9adc5301d2da6a336aafec73f08907a225955751c858098447601aad3f0bbd8967d2cb942bb149ec693da6953f2857c382644f
7
- data.tar.gz: fad7d536c6fc5b1a3ca3f9326b5386c7ca54407b1f0d399a37f0f115e276e6b419dbada1f9d1dba71a588cf8c6c40aac6284b83596b576b598f6d8860df466ea
6
+ metadata.gz: 843e8e7e12bb1f46957613139173307a922ed628ec41a6174c3171d6ff2b68052627c25d5d1471a0b83c4f338269564c04a6de0b716afb5df083de40f42d0903
7
+ data.tar.gz: 9e72222e7fa9327d642cbb31539d21e5bab9bad17ee4c77e50c7a02c9524cbaab7c7037ed9d73b0739aa66f785a53d6f1dd332c27477e3fd4d2ab4c9605f309e
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ = 0.1.3 - 20-Oct-2014
2
+ * Updates to the gem:create and gem:install tasks.
3
+ * Removed references to Rubyforge in the gemspec.
4
+ * Use relative_require where appropriate.
5
+
1
6
  = 0.1.2 - 6-Feb-2014
2
7
  * Altered the constructor. The second argument now controls whether or not
3
8
  to raise an error if the job already exists. By default it will open the job
data/MANIFEST CHANGED
@@ -1,12 +1,12 @@
1
- * CHANGES
2
- * MANIFEST
3
- * Rakefile
4
- * README
5
- * win32-job.gemspec
6
- * examples\example_job.rb
7
- * lib\win32\job.rb
8
- * lib\win32\job\constants.rb
9
- * lib\win32\job\functions.rb
10
- * lib\win32\job\helper.rb
11
- * lib\win32\job\structs.rb
12
- * test\test_win32_job.rb
1
+ * CHANGES
2
+ * MANIFEST
3
+ * Rakefile
4
+ * README
5
+ * win32-job.gemspec
6
+ * examples\example_job.rb
7
+ * lib\win32\job.rb
8
+ * lib\win32\job\constants.rb
9
+ * lib\win32\job\functions.rb
10
+ * lib\win32\job\helper.rb
11
+ * lib\win32\job\structs.rb
12
+ * test\test_win32_job.rb
data/README CHANGED
@@ -35,6 +35,12 @@
35
35
  == License
36
36
  Artistic 2.0
37
37
 
38
+ == Contributions
39
+ Although this library is free, please consider having your company
40
+ setup a gittip if used by your company professionally.
41
+
42
+ http://www.gittip.com/djberg96/
43
+
38
44
  == Copyright
39
45
  (C) 2003-2014 Daniel J. Berger
40
46
  All Rights Reserved
data/Rakefile CHANGED
@@ -1,31 +1,31 @@
1
- require 'rake'
2
- require 'rake/clean'
3
- require 'rake/testtask'
4
-
5
- CLEAN.include("**/*.gem", "**/*.rbc", "**/*.rbx")
6
-
7
- namespace :gem do
8
- desc 'Create the win32-job gem'
9
- task :create do
10
- spec = eval(IO.read('win32-job.gemspec'))
11
- if Gem::VERSION < "2.0"
12
- Gem::Builder.new(spec).build
13
- else
14
- require 'rubygems/package'
15
- Gem::Package.build(spec)
16
- end
17
- end
18
-
19
- desc 'Install the win32-job gem'
20
- task :install => [:create] do
21
- file = Dir["*.gem"].first
22
- sh "gem install #{file}"
23
- end
24
- end
25
-
26
- Rake::TestTask.new do |t|
27
- t.verbose = true
28
- t.warning = true
29
- end
30
-
31
- task :default => :test
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+
5
+ CLEAN.include("**/*.gem", "**/*.rbc", "**/*.rbx")
6
+
7
+ namespace :gem do
8
+ desc 'Create the win32-job gem'
9
+ task :create => [:clean] do
10
+ spec = eval(IO.read('win32-job.gemspec'))
11
+ if Gem::VERSION < "2.0"
12
+ Gem::Builder.new(spec).build
13
+ else
14
+ require 'rubygems/package'
15
+ Gem::Package.build(spec)
16
+ end
17
+ end
18
+
19
+ desc 'Install the win32-job gem'
20
+ task :install => [:create] do
21
+ file = Dir["*.gem"].first
22
+ sh "gem install -l #{file}"
23
+ end
24
+ end
25
+
26
+ Rake::TestTask.new do |t|
27
+ t.verbose = true
28
+ t.warning = true
29
+ end
30
+
31
+ task :default => :test
@@ -1,29 +1,29 @@
1
- #######################################################################
2
- # example_job.rb
3
- #
4
- # Simple example script for futzing with Windows Jobs. This will fire
5
- # up two instances of notepad and add them to the job, then close
6
- # them.
7
- #######################################################################
8
- require 'win32/job'
9
- include Win32
10
-
11
- pid1 = Process.spawn("notepad.exe")
12
- pid2 = Process.spawn("notepad.exe")
13
- sleep 0.5
14
-
15
- j = Job.new('test')
16
-
17
- j.configure_limit(
18
- :breakaway_ok => true,
19
- :kill_on_job_close => true,
20
- :process_memory => 1024 * 8,
21
- :process_time => 1000
22
- )
23
-
24
- j.add_process(pid1)
25
- j.add_process(pid2)
26
-
27
- sleep 0.5
28
-
29
- j.close # Notepad instances should terminate here, too.
1
+ #######################################################################
2
+ # example_job.rb
3
+ #
4
+ # Simple example script for futzing with Windows Jobs. This will fire
5
+ # up two instances of notepad and add them to the job, then close
6
+ # them.
7
+ #######################################################################
8
+ require 'win32/job'
9
+ include Win32
10
+
11
+ pid1 = Process.spawn("notepad.exe")
12
+ pid2 = Process.spawn("notepad.exe")
13
+ sleep 0.5
14
+
15
+ j = Job.new('test')
16
+
17
+ j.configure_limit(
18
+ :breakaway_ok => true,
19
+ :kill_on_job_close => true,
20
+ :process_memory => 1024 * 8,
21
+ :process_time => 1000
22
+ )
23
+
24
+ j.add_process(pid1)
25
+ j.add_process(pid2)
26
+
27
+ sleep 0.5
28
+
29
+ j.close # Notepad instances should terminate here, too.
@@ -1,7 +1,7 @@
1
- require File.join(File.dirname(__FILE__), 'job', 'constants')
2
- require File.join(File.dirname(__FILE__), 'job', 'functions')
3
- require File.join(File.dirname(__FILE__), 'job', 'structs')
4
- require File.join(File.dirname(__FILE__), 'job', 'helper')
1
+ require_relative 'job/constants'
2
+ require_relative 'job/functions'
3
+ require_relative 'job/structs'
4
+ require_relative 'job/helper'
5
5
 
6
6
  # The Win32 module serves as a namespace only.
7
7
  module Win32
@@ -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.2'
17
+ VERSION = '0.1.3'
18
18
 
19
19
  private
20
20
 
@@ -1,65 +1,65 @@
1
- require 'ffi'
2
-
3
- module Windows
4
- module Constants
5
- private
6
-
7
- JobObjectBasicAccountingInformation = 1
8
- JobObjectBasicLimitInformation = 2
9
- JobObjectBasicProcessIdList = 3
10
- JobObjectBasicUIRestrictions = 4
11
- JobObjectSecurityLimitInformation = 5
12
- JobObjectEndOfJobTimeInformation = 6
13
- JobObjectAssociateCompletionPortInformation = 7
14
- JobObjectBasicAndIoAccountingInformation = 8
15
- JobObjectExtendedLimitInformation = 9
16
- JobObjectGroupInformation = 11
17
- JobObjectNotificationLimitInformation = 12
18
- JobObjectLimitViolationInformation = 13
19
- JobObjectGroupInformationEx = 14
20
- JobObjectCpuRateControlInformation = 15
21
-
22
- PROCESS_ALL_ACCESS = 0x1F0FFF
23
- PROCESS_SET_QUOTA = 0x0100
24
- PROCESS_TERMINATE = 0x0001
25
- SYNCHRONIZE = 0x00100000
26
-
27
- INFINITE = 0xFFFFFFFF
28
-
29
- INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
30
- ERROR_ALREADY_EXISTS = 183
31
-
32
- JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008
33
- JOB_OBJECT_LIMIT_AFFINITY = 0x00000010
34
- JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800
35
- JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
36
- JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200
37
- JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004
38
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000
39
- JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040
40
- JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020
41
- JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100
42
- JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002
43
- JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080
44
- JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000
45
- JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x00004000
46
- JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001
47
-
48
- JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO = 4
49
-
50
- WAIT_ABANDONED = 0x00000080
51
- WAIT_IO_COMPLETION = 0x000000C0
52
- WAIT_OBJECT_0 = 0x00000000
53
- WAIT_TIMEOUT = 0x00000102
54
- WAIT_FAILED = 0xFFFFFFFF
55
-
56
- public
57
-
58
- ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000
59
- BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
60
- HIGH_PRIORITY_CLASS = 0x00000080
61
- IDLE_PRIORITY_CLASS = 0x00000040
62
- NORMAL_PRIORITY_CLASS = 0x00000020
63
- REALTIME_PRIORITY_CLASS = 0x00000100
64
- end
65
- end
1
+ require 'ffi'
2
+
3
+ module Windows
4
+ module Constants
5
+ private
6
+
7
+ JobObjectBasicAccountingInformation = 1
8
+ JobObjectBasicLimitInformation = 2
9
+ JobObjectBasicProcessIdList = 3
10
+ JobObjectBasicUIRestrictions = 4
11
+ JobObjectSecurityLimitInformation = 5
12
+ JobObjectEndOfJobTimeInformation = 6
13
+ JobObjectAssociateCompletionPortInformation = 7
14
+ JobObjectBasicAndIoAccountingInformation = 8
15
+ JobObjectExtendedLimitInformation = 9
16
+ JobObjectGroupInformation = 11
17
+ JobObjectNotificationLimitInformation = 12
18
+ JobObjectLimitViolationInformation = 13
19
+ JobObjectGroupInformationEx = 14
20
+ JobObjectCpuRateControlInformation = 15
21
+
22
+ PROCESS_ALL_ACCESS = 0x1F0FFF
23
+ PROCESS_SET_QUOTA = 0x0100
24
+ PROCESS_TERMINATE = 0x0001
25
+ SYNCHRONIZE = 0x00100000
26
+
27
+ INFINITE = 0xFFFFFFFF
28
+
29
+ INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
30
+ ERROR_ALREADY_EXISTS = 183
31
+
32
+ JOB_OBJECT_LIMIT_ACTIVE_PROCESS = 0x00000008
33
+ JOB_OBJECT_LIMIT_AFFINITY = 0x00000010
34
+ JOB_OBJECT_LIMIT_BREAKAWAY_OK = 0x00000800
35
+ JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION = 0x00000400
36
+ JOB_OBJECT_LIMIT_JOB_MEMORY = 0x00000200
37
+ JOB_OBJECT_LIMIT_JOB_TIME = 0x00000004
38
+ JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000
39
+ JOB_OBJECT_LIMIT_PRESERVE_JOB_TIME = 0x00000040
40
+ JOB_OBJECT_LIMIT_PRIORITY_CLASS = 0x00000020
41
+ JOB_OBJECT_LIMIT_PROCESS_MEMORY = 0x00000100
42
+ JOB_OBJECT_LIMIT_PROCESS_TIME = 0x00000002
43
+ JOB_OBJECT_LIMIT_SCHEDULING_CLASS = 0x00000080
44
+ JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK = 0x00001000
45
+ JOB_OBJECT_LIMIT_SUBSET_AFFINITY = 0x00004000
46
+ JOB_OBJECT_LIMIT_WORKINGSET = 0x00000001
47
+
48
+ JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO = 4
49
+
50
+ WAIT_ABANDONED = 0x00000080
51
+ WAIT_IO_COMPLETION = 0x000000C0
52
+ WAIT_OBJECT_0 = 0x00000000
53
+ WAIT_TIMEOUT = 0x00000102
54
+ WAIT_FAILED = 0xFFFFFFFF
55
+
56
+ public
57
+
58
+ ABOVE_NORMAL_PRIORITY_CLASS = 0x00008000
59
+ BELOW_NORMAL_PRIORITY_CLASS = 0x00004000
60
+ HIGH_PRIORITY_CLASS = 0x00000080
61
+ IDLE_PRIORITY_CLASS = 0x00000040
62
+ NORMAL_PRIORITY_CLASS = 0x00000020
63
+ REALTIME_PRIORITY_CLASS = 0x00000100
64
+ end
65
+ end
@@ -1,26 +1,26 @@
1
- require 'ffi'
2
-
3
- module FFI
4
- extend FFI::Library
5
-
6
- ffi_lib :kernel32
7
-
8
- attach_function :FormatMessage, :FormatMessageA,
9
- [:ulong, :pointer, :ulong, :ulong, :pointer, :ulong, :pointer], :ulong
10
-
11
- def win_error(function, err=FFI.errno)
12
- flags = 0x00001000 | 0x00000200
13
- buf = FFI::MemoryPointer.new(:char, 1024)
14
-
15
- FormatMessage(flags, nil, err , 0x0409, buf, 1024, nil)
16
-
17
- function + ': ' + buf.read_string.strip
18
- end
19
-
20
- def raise_windows_error(function, err=FFI.errno)
21
- raise SystemCallError.new(win_error(function, err), err)
22
- end
23
-
24
- module_function :win_error
25
- module_function :raise_windows_error
26
- end
1
+ require 'ffi'
2
+
3
+ module FFI
4
+ extend FFI::Library
5
+
6
+ ffi_lib :kernel32
7
+
8
+ attach_function :FormatMessage, :FormatMessageA,
9
+ [:ulong, :pointer, :ulong, :ulong, :pointer, :ulong, :pointer], :ulong
10
+
11
+ def win_error(function, err=FFI.errno)
12
+ flags = 0x00001000 | 0x00000200
13
+ buf = FFI::MemoryPointer.new(:char, 1024)
14
+
15
+ FormatMessage(flags, nil, err , 0x0409, buf, 1024, nil)
16
+
17
+ function + ': ' + buf.read_string.strip
18
+ end
19
+
20
+ def raise_windows_error(function, err=FFI.errno)
21
+ raise SystemCallError.new(win_error(function, err), err)
22
+ end
23
+
24
+ module_function :win_error
25
+ module_function :raise_windows_error
26
+ end
@@ -1,175 +1,175 @@
1
- require 'ffi'
2
-
3
- module Windows
4
- module Structs
5
- extend FFI::Library
6
-
7
- typedef :uintptr_t, :handle
8
- typedef :ulong, :dword
9
- typedef :ushort, :word
10
-
11
- class LARGE_INTEGER < FFI::Union
12
- layout(:QuadPart, :long_long)
13
- end
14
-
15
- class JOBOBJECT_BASIC_PROCESS_ID_LIST < FFI::Struct
16
- layout(
17
- :NumberOfAssignedProcesses, :ulong,
18
- :NumberOfProcessIdsInList, :ulong,
19
- :ProcessIdList, [:uintptr_t, 100] # Limit 100 processes per job (?)
20
- )
21
- end
22
-
23
- class JOBOBJECT_BASIC_ACCOUNTING_INFORMATION < FFI::Struct
24
- layout(
25
- :TotalUserTime, LARGE_INTEGER,
26
- :TotalKernelTime, LARGE_INTEGER,
27
- :ThisPeriodTotalUserTime, LARGE_INTEGER,
28
- :ThisPeriodTotalKernelTime, LARGE_INTEGER,
29
- :TotalPageFaultCount, :ulong,
30
- :TotalProcesses, :ulong,
31
- :ActiveProcesses, :ulong,
32
- :TotalTerminatedProcesses, :ulong
33
- )
34
- end
35
-
36
- class IO_COUNTERS < FFI::Struct
37
- layout(
38
- :ReadOperationCount, :ulong_long,
39
- :WriteOperationCount, :ulong_long,
40
- :OtherOperationCount, :ulong_long,
41
- :ReadTransferCount, :ulong_long,
42
- :WriteTransferCount, :ulong_long,
43
- :OtherTransferCount, :ulong_long
44
- )
45
- end
46
-
47
- class JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION < FFI::Struct
48
- layout(
49
- :BasicInfo, JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,
50
- :IoInfo, IO_COUNTERS
51
- )
52
- end
53
-
54
- class JOBOBJECT_BASIC_LIMIT_INFORMATION < FFI::Struct
55
- layout(
56
- :PerProcessUserTimeLimit, LARGE_INTEGER,
57
- :PerJobUserTimeLimit, LARGE_INTEGER,
58
- :LimitFlags, :ulong,
59
- :MinimumWorkingSetSize, :size_t,
60
- :MaximumWorkingSetSize, :size_t,
61
- :ActiveProcessLimit, :ulong,
62
- :Affinity, :uintptr_t,
63
- :PriorityClass, :ulong,
64
- :SchedulingClass, :ulong
65
- )
66
- end
67
-
68
- class JOBOBJECT_EXTENDED_LIMIT_INFORMATION < FFI::Struct
69
- layout(
70
- :BasicLimitInformation, JOBOBJECT_BASIC_LIMIT_INFORMATION,
71
- :IoInfo, IO_COUNTERS,
72
- :ProcessMemoryLimit, :size_t,
73
- :JobMemoryLimit, :size_t,
74
- :PeakProcessMemoryUsed, :size_t,
75
- :PeakJobMemoryUsed, :size_t
76
- )
77
- end
78
-
79
- class JOBOBJECT_ASSOCIATE_COMPLETION_PORT < FFI::Struct
80
- layout(:CompletionKey, :uintptr_t, :CompletionPort, :handle)
81
- end
82
-
83
- class SECURITY_ATTRIBUTES < FFI::Struct
84
- layout(
85
- :nLength, :ulong,
86
- :lpSecurityDescriptor, :pointer,
87
- :bInheritHandle, :bool
88
- )
89
- end
90
-
91
- class PROCESS_INFORMATION < FFI::Struct
92
- layout(
93
- :hProcess, :handle,
94
- :hThread, :handle,
95
- :dwProcessId, :dword,
96
- :dwThreadId, :dword
97
- )
98
- end
99
-
100
- class STARTUPINFO < FFI::Struct
101
- layout(
102
- :cb, :ulong,
103
- :lpReserved, :string,
104
- :lpDesktop, :string,
105
- :lpTitle, :string,
106
- :dwX, :dword,
107
- :dwY, :dword,
108
- :dwXSize, :dword,
109
- :dwYSize, :dword,
110
- :dwXCountChars, :dword,
111
- :dwYCountChars, :dword,
112
- :dwFillAttribute, :dword,
113
- :dwFlags, :dword,
114
- :wShowWindow, :word,
115
- :cbReserved2, :word,
116
- :lpReserved2, :pointer,
117
- :hStdInput, :handle,
118
- :hStdOutput, :handle,
119
- :hStdError, :handle
120
- )
121
- end
122
-
123
- # I'm assuming the anonymous struct for the internal union here.
124
- class Overlapped < FFI::Struct
125
- layout(
126
- :Internal, :ulong,
127
- :InternalHigh, :ulong,
128
- :Offset, :ulong,
129
- :OffsetHigh, :ulong,
130
- :hEvent, :ulong
131
- )
132
- end
133
-
134
- # Ruby Structs
135
-
136
- AccountInfo = Struct.new('AccountInfo',
137
- :total_user_time,
138
- :total_kernel_time,
139
- :this_period_total_user_time,
140
- :this_period_total_kernel_time,
141
- :total_page_fault_count,
142
- :total_processes,
143
- :active_processes,
144
- :total_terminated_processes,
145
- :read_operation_count,
146
- :write_operation_count,
147
- :other_operation_count,
148
- :read_transfer_count,
149
- :write_transfer_count,
150
- :other_transfer_count
151
- )
152
-
153
- LimitInfo = Struct.new('LimitInfo',
154
- :per_process_user_time_limit,
155
- :per_job_user_time_limit,
156
- :limit_flags,
157
- :minimum_working_set_size,
158
- :maximum_working_set_size,
159
- :active_process_limit,
160
- :affinity,
161
- :priority_class,
162
- :scheduling_class,
163
- :read_operation_count,
164
- :write_operation_count,
165
- :other_operation_count,
166
- :read_transfer_count,
167
- :write_transfer_count,
168
- :other_transfer_count,
169
- :process_memory_limit,
170
- :job_memory_limit,
171
- :peak_process_memory_used,
172
- :peek_job_memory_used
173
- )
174
- end
175
- end
1
+ require 'ffi'
2
+
3
+ module Windows
4
+ module Structs
5
+ extend FFI::Library
6
+
7
+ typedef :uintptr_t, :handle
8
+ typedef :ulong, :dword
9
+ typedef :ushort, :word
10
+
11
+ class LARGE_INTEGER < FFI::Union
12
+ layout(:QuadPart, :long_long)
13
+ end
14
+
15
+ class JOBOBJECT_BASIC_PROCESS_ID_LIST < FFI::Struct
16
+ layout(
17
+ :NumberOfAssignedProcesses, :ulong,
18
+ :NumberOfProcessIdsInList, :ulong,
19
+ :ProcessIdList, [:uintptr_t, 100] # Limit 100 processes per job (?)
20
+ )
21
+ end
22
+
23
+ class JOBOBJECT_BASIC_ACCOUNTING_INFORMATION < FFI::Struct
24
+ layout(
25
+ :TotalUserTime, LARGE_INTEGER,
26
+ :TotalKernelTime, LARGE_INTEGER,
27
+ :ThisPeriodTotalUserTime, LARGE_INTEGER,
28
+ :ThisPeriodTotalKernelTime, LARGE_INTEGER,
29
+ :TotalPageFaultCount, :ulong,
30
+ :TotalProcesses, :ulong,
31
+ :ActiveProcesses, :ulong,
32
+ :TotalTerminatedProcesses, :ulong
33
+ )
34
+ end
35
+
36
+ class IO_COUNTERS < FFI::Struct
37
+ layout(
38
+ :ReadOperationCount, :ulong_long,
39
+ :WriteOperationCount, :ulong_long,
40
+ :OtherOperationCount, :ulong_long,
41
+ :ReadTransferCount, :ulong_long,
42
+ :WriteTransferCount, :ulong_long,
43
+ :OtherTransferCount, :ulong_long
44
+ )
45
+ end
46
+
47
+ class JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION < FFI::Struct
48
+ layout(
49
+ :BasicInfo, JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,
50
+ :IoInfo, IO_COUNTERS
51
+ )
52
+ end
53
+
54
+ class JOBOBJECT_BASIC_LIMIT_INFORMATION < FFI::Struct
55
+ layout(
56
+ :PerProcessUserTimeLimit, LARGE_INTEGER,
57
+ :PerJobUserTimeLimit, LARGE_INTEGER,
58
+ :LimitFlags, :ulong,
59
+ :MinimumWorkingSetSize, :size_t,
60
+ :MaximumWorkingSetSize, :size_t,
61
+ :ActiveProcessLimit, :ulong,
62
+ :Affinity, :uintptr_t,
63
+ :PriorityClass, :ulong,
64
+ :SchedulingClass, :ulong
65
+ )
66
+ end
67
+
68
+ class JOBOBJECT_EXTENDED_LIMIT_INFORMATION < FFI::Struct
69
+ layout(
70
+ :BasicLimitInformation, JOBOBJECT_BASIC_LIMIT_INFORMATION,
71
+ :IoInfo, IO_COUNTERS,
72
+ :ProcessMemoryLimit, :size_t,
73
+ :JobMemoryLimit, :size_t,
74
+ :PeakProcessMemoryUsed, :size_t,
75
+ :PeakJobMemoryUsed, :size_t
76
+ )
77
+ end
78
+
79
+ class JOBOBJECT_ASSOCIATE_COMPLETION_PORT < FFI::Struct
80
+ layout(:CompletionKey, :uintptr_t, :CompletionPort, :handle)
81
+ end
82
+
83
+ class SECURITY_ATTRIBUTES < FFI::Struct
84
+ layout(
85
+ :nLength, :ulong,
86
+ :lpSecurityDescriptor, :pointer,
87
+ :bInheritHandle, :bool
88
+ )
89
+ end
90
+
91
+ class PROCESS_INFORMATION < FFI::Struct
92
+ layout(
93
+ :hProcess, :handle,
94
+ :hThread, :handle,
95
+ :dwProcessId, :dword,
96
+ :dwThreadId, :dword
97
+ )
98
+ end
99
+
100
+ class STARTUPINFO < FFI::Struct
101
+ layout(
102
+ :cb, :ulong,
103
+ :lpReserved, :string,
104
+ :lpDesktop, :string,
105
+ :lpTitle, :string,
106
+ :dwX, :dword,
107
+ :dwY, :dword,
108
+ :dwXSize, :dword,
109
+ :dwYSize, :dword,
110
+ :dwXCountChars, :dword,
111
+ :dwYCountChars, :dword,
112
+ :dwFillAttribute, :dword,
113
+ :dwFlags, :dword,
114
+ :wShowWindow, :word,
115
+ :cbReserved2, :word,
116
+ :lpReserved2, :pointer,
117
+ :hStdInput, :handle,
118
+ :hStdOutput, :handle,
119
+ :hStdError, :handle
120
+ )
121
+ end
122
+
123
+ # I'm assuming the anonymous struct for the internal union here.
124
+ class Overlapped < FFI::Struct
125
+ layout(
126
+ :Internal, :ulong,
127
+ :InternalHigh, :ulong,
128
+ :Offset, :ulong,
129
+ :OffsetHigh, :ulong,
130
+ :hEvent, :ulong
131
+ )
132
+ end
133
+
134
+ # Ruby Structs
135
+
136
+ AccountInfo = Struct.new('AccountInfo',
137
+ :total_user_time,
138
+ :total_kernel_time,
139
+ :this_period_total_user_time,
140
+ :this_period_total_kernel_time,
141
+ :total_page_fault_count,
142
+ :total_processes,
143
+ :active_processes,
144
+ :total_terminated_processes,
145
+ :read_operation_count,
146
+ :write_operation_count,
147
+ :other_operation_count,
148
+ :read_transfer_count,
149
+ :write_transfer_count,
150
+ :other_transfer_count
151
+ )
152
+
153
+ LimitInfo = Struct.new('LimitInfo',
154
+ :per_process_user_time_limit,
155
+ :per_job_user_time_limit,
156
+ :limit_flags,
157
+ :minimum_working_set_size,
158
+ :maximum_working_set_size,
159
+ :active_process_limit,
160
+ :affinity,
161
+ :priority_class,
162
+ :scheduling_class,
163
+ :read_operation_count,
164
+ :write_operation_count,
165
+ :other_operation_count,
166
+ :read_transfer_count,
167
+ :write_transfer_count,
168
+ :other_transfer_count,
169
+ :process_memory_limit,
170
+ :job_memory_limit,
171
+ :peak_process_memory_used,
172
+ :peek_job_memory_used
173
+ )
174
+ end
175
+ end
@@ -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.2', Win32::Job::VERSION)
18
+ assert_equal('0.1.3', Win32::Job::VERSION)
19
19
  end
20
20
 
21
21
  test "constructor argument may be omitted" do
@@ -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.2'
5
+ spec.version = '0.1.3'
6
6
  spec.authors = ['Daniel J. Berger', 'Park Heesob']
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.email = 'djberg96@gmail.com'
@@ -12,7 +12,6 @@ Gem::Specification.new do |spec|
12
12
  spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
13
13
 
14
14
  spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
15
- spec.rubyforge_project = 'win32utils'
16
15
  spec.required_ruby_version = '> 1.9.3'
17
16
 
18
17
  spec.add_dependency('ffi')
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.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -9,48 +9,48 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-07 00:00:00.000000000 Z
12
+ date: 2014-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: test-unit
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  description: |2
@@ -87,16 +87,16 @@ require_paths:
87
87
  - lib
88
88
  required_ruby_version: !ruby/object:Gem::Requirement
89
89
  requirements:
90
- - - '>'
90
+ - - ">"
91
91
  - !ruby/object:Gem::Version
92
92
  version: 1.9.3
93
93
  required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  requirements: []
99
- rubyforge_project: win32utils
99
+ rubyforge_project:
100
100
  rubygems_version: 2.2.2
101
101
  signing_key:
102
102
  specification_version: 4