proc-wait3 1.9.0 → 1.9.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
  SHA256:
3
- metadata.gz: 833ae8756453e432d042610abec187891cd8c53c9c03f942a247cc0f6488979b
4
- data.tar.gz: 873ae57b81c82f55f9a34e975ae53eb71319d8c65fde352bfef7bd62f9000cb4
3
+ metadata.gz: a6e56b25dc085ce18c5808a81d259c4e9f54cb75d1ff985985bb5a575d58ed90
4
+ data.tar.gz: 65379d28529797369401cc65abb6c234b9cf1995ec7cf92152d03c03c6a89a83
5
5
  SHA512:
6
- metadata.gz: 2798ca928c06bd913b04665f7adcd02ac73f2d6d742e30c7d08e15a56c7a284e9cd2cc3b2cb9d8c923fa82d1297fbe30488de848504ffef0cd3dd9a776a6146a
7
- data.tar.gz: 28976b3335794b2cf0bd0002dafa58c5d3b8eec326d52bd085c34afebc79f3fff838b3c2da12779089d008b037dd7b7ae56b2b2c0f0299e95eb34bb163ff88af
6
+ metadata.gz: 51f2d1148e8fcadb8b9530420ac164e81b4645b04e3f7b8acded43a62acaa3000240f5e5e53b5fda4cc734f0e2f76edbf76d5b325c2cc3fefd450cf0f60ca519
7
+ data.tar.gz: ce1e71899e8db9c2c74bb5207d3a715e7cf8b355d0c5b6bc203b51608647d90fe53c0414bce48ee38c1c796987df7f9fa2b4a30c9eeebdd35900e34d288be82a
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGES.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 1.9.2 - 21-Apr-2024
2
+ * Added the P_JAILID constant for BSD platforms.
3
+ * Added some notes to the README for coping with EINTR.
4
+ * Added rubocop and rubocop-rspec as dev dependencies and did
5
+ some general rubocop cleanup.
6
+
7
+ ## 1.9.1 - 8-Feb-2024
8
+ * Replace sigset with sigaction in the pause method.
9
+ * General cleanup and platform handling updates.
10
+
1
11
  ## 1.9.0 - 7-Jan-2021
2
12
  * Switched from test-unit to rspec.
3
13
  * Skip some tests on Darwin because of EINTR errors.
data/Gemfile CHANGED
@@ -1,7 +1,2 @@
1
- source 'https://rubygems.org' do
2
- gem 'rake'
3
-
4
- group 'test' do
5
- gem 'rspec', '~> 3.9'
6
- end
7
- end
1
+ source 'https://rubygems.org'
2
+ gemspec
data/MANIFEST.md CHANGED
@@ -6,7 +6,7 @@
6
6
  * README.md
7
7
  * proc-wait3.gemspec
8
8
  * certs/djberg96_pub.pem
9
- * doc/wait3.txt
9
+ * doc/wait3.md
10
10
  * ext/extconf.rb
11
11
  * ext/proc/wait3.c
12
12
  * examples/example_getrusage.rb
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Ruby](https://github.com/djberg96/proc-wait3/actions/workflows/ruby.yml/badge.svg)](https://github.com/djberg96/proc-wait3/actions/workflows/ruby.yml)
2
+
1
3
  ## Description
2
4
  Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the Process module.
3
5
 
@@ -32,9 +34,41 @@ Linux users may also notice warnings about implicit declarations. These
32
34
  are also harmless, and can be silenced by installing the libbsd-dev package
33
35
  first.
34
36
 
35
- On Darwin these methods will likely fail with Errno::EINTR unless you pass
36
- the WNOHANG flag. I am not sure why, I can only speculate that the child is
37
- receiving a signal from either the Ruby interpreter or the operating system.
37
+ These methods may fail in conjunction with `fork` with `Errno::EINTR` unless
38
+ you pass the WNOHANG flag, or explicitly ignore the `SIGCHLD` signal. Ruby's
39
+ own `wait` methods appear to essentially be doing that behind the scenes.
40
+
41
+ Note that on some platforms just setting a `SIGCHLD` handler may not be
42
+ enough to prevent an `Errno::EINTR` from occuring since you can never be sure
43
+ what signal it's going to receive. Since this appears to be coming from the
44
+ guts of the Ruby core code itself IMO, it's somewhat out of my hands, but it's
45
+ not impossible to deal with.
46
+
47
+ A typical idiom would be to simulate the `TEMP_FAILURE_RETRY` macro that the GNU
48
+ library provides. This macro wraps a given function and retries it so long as
49
+ it doesn't fail, or the only failure is an `EINTR`. I've chosen not to integrate
50
+ this into the code directly (yet), but you can simulate it like so:
51
+
52
+ ```ruby
53
+ require 'English'
54
+
55
+ begin
56
+ pid = fork{ sleep 1; exit 2 }
57
+ Process.wait3
58
+ rescue Errno::EINTR
59
+ retry
60
+ end
61
+
62
+ p $CHILD_STATUS
63
+ ```
64
+
65
+ For more information please see:
66
+
67
+ https://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Interrupted-Primitives.html
68
+
69
+ BSD provides another approach using sigaction handlers + `SA_RESTART`, but it requires knowing
70
+ the signal type in advance. So, unless you want to apply the same handler to *every* type of
71
+ signal, I don't find it especially useful.
38
72
 
39
73
  ## Integration with Ruby's process.c
40
74
  I considered simply providing a patch to the core process.c file, but I
@@ -50,4 +84,4 @@ trouble of typing the word "status", since all they're for is comparing or
50
84
  operating on the status attribute.
51
85
 
52
86
  ## Additional Documentation
53
- Please see the doc/wait3.txt file for detailed documentation.
87
+ Please see the doc/wait3.md file for detailed documentation.
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rake'
2
2
  require 'rake/clean'
3
3
  require 'rspec/core/rake_task'
4
+ require 'rubocop/rake_task'
4
5
  require 'fileutils'
5
6
  require 'rbconfig'
6
7
  include RbConfig
@@ -27,15 +28,15 @@ task :build => [:clean] do |t|
27
28
  end
28
29
 
29
30
  namespace :gem do
30
- desc "Create the proc-wait3 gem"
31
+ desc 'Create the proc-wait3 gem'
31
32
  task :create => [:clean] do
32
33
  require 'rubygems/package'
33
- spec = eval(IO.read('proc-wait3.gemspec'))
34
+ spec = Gem::Specification.load('proc-wait3.gemspec')
34
35
  spec.signing_key = File.join(Dir.home, '.ssh', 'gem-private_key.pem')
35
36
  Gem::Package.build(spec)
36
37
  end
37
38
 
38
- desc "Install the proc-wait3 gem"
39
+ desc 'Install the proc-wait3 gem'
39
40
  task :install => [:create] do |t|
40
41
  file = Dir['*.gem'].first
41
42
  sh "gem install -l #{file}"
@@ -69,9 +70,11 @@ namespace :example do
69
70
  end
70
71
  end
71
72
 
72
- desc "Run the test suite"
73
+ desc 'Run the test suite'
73
74
  RSpec::Core::RakeTask.new(:spec) do |t|
74
75
  t.rspec_opts = '-Iext'
75
76
  end
76
77
 
77
78
  task :default => [:build, :spec]
79
+
80
+ RuboCop::RakeTask.new
data/doc/wait3.md ADDED
@@ -0,0 +1,225 @@
1
+ ## Description
2
+ Adds the `wait3`, `wait4`, `waitid`, `pause`, `sigsend`, and `getrusage`
3
+ methods to the Process module.
4
+
5
+ ## Synopsis
6
+ ```ruby
7
+ require 'proc/wait3'
8
+
9
+ pid = fork{ sleep 1; exit 2 }
10
+ p Time.now
11
+ Process.wait3
12
+ p $?
13
+ ```
14
+
15
+ ## Module Methods
16
+ ### `Process.pause(signals=nil)`
17
+
18
+ Pauses the current process. If the process receives any of the signals
19
+ you pass as arguments it will return from the pause and continue with
20
+ the execution of your code. Otherwise, it will exit.
21
+
22
+ Note that you must leave out the 'SIG' prefix for the signal name, e.g.
23
+ use 'INT', not 'SIGINT'.
24
+
25
+ Returns the result of the underlying `pause()` function, which should always be -1.
26
+
27
+ ### `Process.sigsend(idtype, id, signal=0)`
28
+
29
+ Sends a signal of type "idtype" to a process or process group "id". This
30
+ is more versatile method of sending signals to processes than Process.kill.
31
+
32
+ For a list of valid idtype values, see the "Process type constants" below.
33
+ Not supported on all platforms.
34
+
35
+ ### `Proc.wait3(flags=0)`
36
+
37
+ Delays its caller until a signal is received or one of its child processes
38
+ terminates or stops due to tracing.
39
+
40
+ The return value is a ProcStat structure and sets the `$last_status` global
41
+ variable. The special global $? is also set. Raises a SystemError if there
42
+ are no child processes.
43
+
44
+ ### `Proc.wait4(pid, flags=0)`
45
+
46
+ Waits for the given child process to exit. Returns a ProcStat structure.
47
+ The `$last_status` global variable is set. Also sets the `$?` special global
48
+ variable.
49
+
50
+ ### `Proc.waitid(id_type, id_num=nil, options=nil)`
51
+
52
+ Suspends the calling process until one of its children changes state,
53
+ returning immediately if a child process changed state prior to the call.
54
+ The state of a child process will change if it terminates, stops because
55
+ of a signal, becomes trapped or reaches a breakpoint.
56
+
57
+ The `id_num` corresponds to a process ID or process group ID, depending on
58
+ the value of `id_type`, which may be `Process::P_PID`, `Process::P_PGID` or
59
+ `Process::P_ALL`. If `id_type` is `Process::P_ALL`, then the `id_num` is ignored.
60
+
61
+ The options argument is used to specify which state changes are to be
62
+ waited for. It is constructed from the bitwise-OR of one or more of the
63
+ following constants:
64
+
65
+ * Process::WCONTINUED
66
+ * Process::WEXITED
67
+ * Process::WNOHANG
68
+ * Process::WNOWAIT
69
+ * Process::WSTOPPED
70
+ * Process::WTRAPPED (not supported on all platforms)
71
+
72
+ If `Process::WNOHANG` is set as an option, this method will return
73
+ immediately, whether or not a child has changed state.
74
+
75
+ Calling this method with an `id_type` of `Process::P_ALL` and the options set
76
+ to `Process::EXITED | Process::WTRAPPED` is equivalent to calling
77
+ Process.wait.
78
+
79
+ Returns a `Proc::SigInfo` struct and sets `$?`.
80
+
81
+ Not supported on all platforms.
82
+
83
+ ## Standard Constants
84
+ `Process::WAIT3_VERSION`
85
+
86
+ Returns the version of this package as a string.
87
+
88
+ ## Process type constants - all platforms
89
+ `Process::P_ALL`
90
+
91
+ All non-system process.
92
+
93
+ `Process::P_PID`
94
+
95
+ A standard process id.
96
+
97
+ `Process::P_PGID`
98
+
99
+ Any non-system process group id.
100
+
101
+ ## Process type constants - not all platforms supported
102
+ `Process::P_CID`
103
+
104
+ A scheduler process id.
105
+
106
+ `Process::P_GID`
107
+
108
+ Any non-system effective process group id.
109
+
110
+ `Process::P_PROJID`
111
+
112
+ A project process id. Solaris 8 or later only.
113
+
114
+ `Process::P_SID`
115
+
116
+ A session process id.
117
+
118
+ `Process::P_TASKID`
119
+
120
+ A task process id. Solaris 8 or later only.
121
+
122
+ `Process::P_UID`
123
+
124
+ Any non-system effective process user id.
125
+
126
+ ## Additional Process constants - defined if waitid is defined on your system
127
+ `Process::WCONTINUED`
128
+
129
+ Return the status for any child that was stopped and has been continued.
130
+
131
+ `Process::WEXITED`
132
+
133
+ Wait for process(es) to exit.
134
+
135
+ `Process::WNOWAIT`
136
+
137
+ Keep the process in a waitable state.
138
+
139
+ `Process::WSTOPPED`
140
+
141
+ Wait for and return the process status of any child that has stopped upon
142
+ receipt of a signal.
143
+
144
+ `Process::WTRAPPED`
145
+
146
+ Wait for traced process(es) to become trapped or reach a breakpoint.
147
+
148
+ Not supported on all platforms.
149
+
150
+ ## RLIMIT constants
151
+ `Process::RLIMIT_AS`
152
+
153
+ A synonym for `RLIMIT_VMEM`.
154
+
155
+ `Process::RLIMIT_CORE`
156
+
157
+ The maximum size of a core file, in bytes, that may be created.
158
+
159
+ `Process::RLIMIT_CPU`
160
+
161
+ The maximum amount of CPU time, in seconds, the process is allowed to use.
162
+
163
+ `Process::RLIMIT_DATA`
164
+
165
+ The maximum size of the process' heap size, in bytes.
166
+
167
+ `Process::RLIMIT_FSIZE`
168
+
169
+ The maximum size of a file, in bytes, that the process may create.
170
+
171
+ `Process::RLIMIT_NOFILE`
172
+
173
+ The maximum value that the kernel may assign to a file descriptor,
174
+ effectively limiting the number of open files for the calling process.
175
+
176
+ `Process::RLIMIT_STACK`
177
+
178
+ The maximum size of the process' stack in bytes.
179
+
180
+ `Process::RLIMIT_VMEM`
181
+
182
+ The maximum size of the process' mapped address space.
183
+
184
+ `Process::RLIM_INFINITY`
185
+
186
+ A infinite limit.
187
+
188
+ `Process::RLIM_SAVED_CUR`
189
+
190
+ Current soft limit.
191
+
192
+ `Process::RLIM_SAVED_MAX`
193
+
194
+ Current hard limit.
195
+
196
+ ## Notes
197
+ The `wait3` and `wait4` methods are similar to the `wait2` and `waitpid2`
198
+ methods, except that they return much more information via the rusage
199
+ struct.
200
+
201
+ ## Future Plans
202
+ Wrap the wait6 function, and add better BSD support in general.
203
+
204
+ ## Known Bugs
205
+ None that I'm aware of. Please log any bugs on the Github project
206
+ page at https://github.com/djberg96/proc-wait3.
207
+
208
+ ## License
209
+ Apache-2.0
210
+
211
+ ## Copyright
212
+ (C) 2003-2024 Daniel J. Berger
213
+
214
+ All Rights Reserved.
215
+
216
+ ## Warranty
217
+ This package is provided "as is" and without any express or
218
+ implied warranties, including, without limitation, the implied
219
+ warranties of merchantability and fitness for a particular purpose.
220
+
221
+ ## Author
222
+ Daniel J. Berger
223
+
224
+ ## See also
225
+ wait3, wait4, waitid, pause, sigsend
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ########################################################################
2
4
  # example_getrusage.rb
3
5
  #
@@ -11,7 +13,7 @@ require 'pp'
11
13
 
12
14
  # Show resource stats for this process for 30 seconds
13
15
  10.times do
14
- pp Process.getrusage
15
- puts "=" * 50
16
- sleep 3
16
+ pp Process.getrusage
17
+ puts '=' * 50
18
+ sleep 3
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #######################################################################
2
4
  # example_pause.rb
3
5
  #
@@ -9,13 +11,13 @@
9
11
  require 'rbconfig'
10
12
  require 'proc/wait3'
11
13
 
12
- puts "Pausing. Hit Ctrl-C to continue."
14
+ puts 'Pausing. Hit Ctrl-C to continue.'
13
15
 
14
- if Config::CONFIG['host_os'] =~ /linux/i
15
- Process.pause(2)
16
+ if RbConfig::CONFIG['host_os'] =~ /linux|darwin/i
17
+ Process.pause(2)
16
18
  else
17
- Process.pause("INT")
19
+ Process.pause('INT')
18
20
  end
19
21
 
20
- puts "Hey, thanks for hitting Ctrl-C. Continuing..."
21
- puts "Done"
22
+ puts 'Hey, thanks for hitting Ctrl-C. Continuing...'
23
+ puts 'Done'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #######################################################################
2
4
  # example_wait3.rb
3
5
  #
@@ -6,10 +8,11 @@
6
8
  #
7
9
  # Modify as you see fit.
8
10
  #######################################################################
11
+ require 'English'
9
12
  require 'proc/wait3'
10
13
 
11
- pid = fork{ sleep 1; exit 2 }
14
+ pid = fork { sleep 1; exit 2 }
12
15
 
13
16
  p Time.now
14
17
  Process.wait3
15
- p $?
18
+ p $CHILD_STATUS
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #######################################################################
2
4
  # example_wait4.rb
3
5
  #
@@ -6,9 +8,10 @@
6
8
  #
7
9
  # Modify as you see fit.
8
10
  #######################################################################
11
+ require 'English'
9
12
  require 'proc/wait3'
10
13
 
11
- pid = fork{ sleep 2 }
14
+ pid = fork { sleep 2 }
12
15
  p Time.now
13
16
  Process.wait4(pid, Process::WUNTRACED)
14
- p $?
17
+ p $CHILD_STATUS
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #######################################################################
2
4
  # example_waitid.rb
3
5
  #
@@ -6,9 +8,10 @@
6
8
  #
7
9
  # Modify as you see fit.
8
10
  #######################################################################
11
+ require 'English'
9
12
  require 'proc/wait3'
10
13
 
11
- pid = fork{ sleep 2 }
14
+ pid = fork { sleep 2 }
12
15
  p Time.now
13
16
  Process.waitid(Process::P_PID, pid, Process::WEXITED)
14
- p $?
17
+ p $CHILD_STATUS
data/ext/extconf.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ########################################################
2
4
  # Use the mkmf.rb file that I provide, so I can use the
3
5
  # have_enum_member method
@@ -7,12 +9,12 @@ require 'mkmf'
7
9
  dir_config('proc-wait3')
8
10
 
9
11
  have_header('wait.h')
10
- have_header('sys/resource.h')
12
+ have_header('sys/resource.h') # apt install libbsd-dev
11
13
  have_header('sys/wait.h')
12
14
 
13
15
  # wait3 is mandatory.
14
16
  unless have_func('wait3')
15
- STDERR.puts 'wait3() function not found'
17
+ warn 'wait3() function not found'
16
18
  exit
17
19
  end
18
20
 
@@ -53,20 +55,7 @@ have_struct_member('struct siginfo', 'si_stime', 'signal.h')
53
55
 
54
56
  have_const('P_CID', 'signal.h')
55
57
  have_const('P_GID', 'signal.h')
56
- have_const('P_MYID', 'signal.hclass PasswdStruct < FFI::Struct
57
- layout(
58
- :pw_name, :string,
59
- :pw_passwd, :string,
60
- :pw_uid, :uint,
61
- :pw_gid, :uint,
62
- :pw_change, :ulong,
63
- :pw_class, :string,
64
- :pw_gecos, :string,
65
- :pw_dir, :string,
66
- :pw_shell, :string,
67
- :pw_expire, :ulong
68
- )
69
- end')
58
+ have_const('P_MYID', 'signal.h')
70
59
  have_const('P_SID', 'signal.h')
71
60
  have_const('P_UID', 'signal.h')
72
61
 
@@ -81,4 +70,7 @@ have_const('P_TASKID', 'signal.h')
81
70
  # RUSAGE_THREAD is Linux-specific
82
71
  have_const('RUSAGE_THREAD', 'sys/resource.h')
83
72
 
73
+ # BSD
74
+ have_const('P_JAILID', 'sys/wait.h')
75
+
84
76
  create_makefile('proc/wait3', 'proc')
data/ext/proc/wait3.c CHANGED
@@ -29,7 +29,7 @@
29
29
  VALUE v_last_status;
30
30
  VALUE v_procstat_struct, v_siginfo_struct, v_usage_struct;
31
31
 
32
- static void sigproc(int signum);
32
+ static void sigproc(int signum, siginfo_t* info, void* ucontext);
33
33
 
34
34
  /*
35
35
  * Returns true if this process is stopped. This is only returned
@@ -163,22 +163,22 @@ static VALUE proc_wait3(int argc, VALUE *argv, VALUE mod){
163
163
  v_last_status = rb_struct_new(v_procstat_struct,
164
164
  INT2FIX(pid),
165
165
  INT2FIX(status),
166
- INT2FIX(r.ru_utime.tv_sec + (r.ru_utime.tv_usec/1e6)),
167
- INT2FIX(r.ru_stime.tv_sec + (r.ru_stime.tv_usec/1e6)),
168
- INT2FIX(r.ru_maxrss),
169
- INT2FIX(r.ru_ixrss),
170
- INT2FIX(r.ru_idrss),
171
- INT2FIX(r.ru_isrss),
172
- INT2FIX(r.ru_minflt),
173
- INT2FIX(r.ru_majflt),
174
- INT2FIX(r.ru_nswap),
175
- INT2FIX(r.ru_inblock),
176
- INT2FIX(r.ru_oublock),
177
- INT2FIX(r.ru_msgsnd),
178
- INT2FIX(r.ru_msgrcv),
179
- INT2FIX(r.ru_nsignals),
180
- INT2FIX(r.ru_nvcsw),
181
- INT2FIX(r.ru_nivcsw),
166
+ rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
167
+ rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
168
+ LONG2NUM(r.ru_maxrss),
169
+ LONG2NUM(r.ru_ixrss),
170
+ LONG2NUM(r.ru_idrss),
171
+ LONG2NUM(r.ru_isrss),
172
+ LONG2NUM(r.ru_minflt),
173
+ LONG2NUM(r.ru_majflt),
174
+ LONG2NUM(r.ru_nswap),
175
+ LONG2NUM(r.ru_inblock),
176
+ LONG2NUM(r.ru_oublock),
177
+ LONG2NUM(r.ru_msgsnd),
178
+ LONG2NUM(r.ru_msgrcv),
179
+ LONG2NUM(r.ru_nsignals),
180
+ LONG2NUM(r.ru_nvcsw),
181
+ LONG2NUM(r.ru_nivcsw),
182
182
  pst_wifstopped(status),
183
183
  pst_wifsignaled(status),
184
184
  pst_wifexited(status),
@@ -235,22 +235,22 @@ static VALUE proc_wait4(int argc, VALUE *argv, VALUE mod){
235
235
  v_last_status = rb_struct_new(v_procstat_struct,
236
236
  INT2FIX(pid),
237
237
  INT2FIX(status),
238
- INT2FIX(r.ru_utime.tv_sec + (r.ru_utime.tv_usec/1e6)),
239
- INT2FIX(r.ru_stime.tv_sec + (r.ru_stime.tv_usec/1e6)),
240
- INT2FIX(r.ru_maxrss),
241
- INT2FIX(r.ru_ixrss),
242
- INT2FIX(r.ru_idrss),
243
- INT2FIX(r.ru_isrss),
244
- INT2FIX(r.ru_minflt),
245
- INT2FIX(r.ru_majflt),
246
- INT2FIX(r.ru_nswap),
247
- INT2FIX(r.ru_inblock),
248
- INT2FIX(r.ru_oublock),
249
- INT2FIX(r.ru_msgsnd),
250
- INT2FIX(r.ru_msgrcv),
251
- INT2FIX(r.ru_nsignals),
252
- INT2FIX(r.ru_nvcsw),
253
- INT2FIX(r.ru_nivcsw),
238
+ rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
239
+ rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
240
+ LONG2NUM(r.ru_maxrss),
241
+ LONG2NUM(r.ru_ixrss),
242
+ LONG2NUM(r.ru_idrss),
243
+ LONG2NUM(r.ru_isrss),
244
+ LONG2NUM(r.ru_minflt),
245
+ LONG2NUM(r.ru_majflt),
246
+ LONG2NUM(r.ru_nswap),
247
+ LONG2NUM(r.ru_inblock),
248
+ LONG2NUM(r.ru_oublock),
249
+ LONG2NUM(r.ru_msgsnd),
250
+ LONG2NUM(r.ru_msgrcv),
251
+ LONG2NUM(r.ru_nsignals),
252
+ LONG2NUM(r.ru_nvcsw),
253
+ LONG2NUM(r.ru_nivcsw),
254
254
  pst_wifstopped(status),
255
255
  pst_wifsignaled(status),
256
256
  pst_wifexited(status),
@@ -572,7 +572,7 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
572
572
  */
573
573
  static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
574
574
  VALUE v_signals;
575
- int i;
575
+ int i, res;
576
576
  long len;
577
577
 
578
578
  rb_scan_args(argc, argv, "0*", &v_signals);
@@ -585,6 +585,7 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
585
585
  char signame[SIG2STR_MAX];
586
586
  unsigned int max = SIG2STR_MAX;
587
587
  int signum;
588
+ struct sigaction act, sa;
588
589
 
589
590
  for(i = 0; i < len; i++){
590
591
  v_val = rb_ary_shift(v_signals);
@@ -613,7 +614,13 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
613
614
  signum = NUM2INT(v_val);
614
615
  }
615
616
 
616
- sigset(signum, sigproc);
617
+ memset(&act, 0, sizeof(act));
618
+ act.sa_flags = SA_SIGINFO;
619
+ act.sa_sigaction = sigproc;
620
+ res = sigaction(signum, &act, &sa);
621
+
622
+ if(res)
623
+ rb_sys_fail("sigaction");
617
624
  }
618
625
  }
619
626
 
@@ -624,7 +631,7 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
624
631
  * This is just a placeholder proc to prevent the "pause" method from exiting
625
632
  * the program if the appropriate signal is intercepted.
626
633
  */
627
- static void sigproc(int signum){ /* Do nothing */ }
634
+ static void sigproc(int signum, siginfo_t* info, void* ucontext){ /* Do nothing */ }
628
635
 
629
636
  #ifdef HAVE_SIGSEND
630
637
  /*
@@ -787,7 +794,7 @@ static VALUE proc_getdtablesize(VALUE mod){
787
794
  * Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the
788
795
  * Process module.
789
796
  */
790
- void Init_wait3()
797
+ void Init_wait3(void)
791
798
  {
792
799
  v_procstat_struct =
793
800
  rb_struct_define("ProcStat","pid","status","utime","stime","maxrss",
@@ -950,12 +957,17 @@ void Init_wait3()
950
957
  rb_define_const(rb_mProcess, "P_PROJID", INT2FIX(P_PROJID));
951
958
  #endif
952
959
 
960
+ #ifdef HAVE_CONST_P_JAILID
961
+ /* Process jail ID */
962
+ rb_define_const(rb_mProcess, "P_JAILID", INT2FIX(P_JAILID));
963
+ #endif
964
+
953
965
  #ifdef HAVE_CONST_RUSAGE_THREAD
954
966
  rb_define_const(rb_mProcess, "RUSAGE_THREAD", INT2FIX(RUSAGE_THREAD));
955
967
  #endif
956
968
 
957
- /* 1.9.0: The version of the proc-wait3 library */
958
- rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_freeze(rb_str_new2("1.9.0")));
969
+ /* 1.9.2: The version of the proc-wait3 library */
970
+ rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_freeze(rb_str_new2("1.9.2")));
959
971
 
960
972
  /* Define this last in our Init_wait3 function */
961
973
  rb_define_readonly_variable("$last_status", &v_last_status);
data/lib/proc-wait3.rb CHANGED
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'proc/wait3'