proc-wait3 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGES +9 -0
- data/README +1 -2
- data/Rakefile +8 -3
- data/doc/wait3.txt +9 -18
- data/ext/extconf.rb +15 -1
- data/ext/proc/wait3.c +97 -85
- data/proc-wait3.gemspec +4 -5
- data/test/test_proc_wait3.rb +91 -109
- metadata +55 -56
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c48dfef5da3932850a5edfd6fc5dc1ccb710ede6
|
4
|
+
data.tar.gz: f861c07250bef10b844fb787839066659916cfc9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 79bb2aec93d32d8cbd1d22030e9fe8f684f38faacf3c0cb2ce79e4d3c30a710c863cbb017cfcfe94922612bbc6548c81c3f817683e50a8d0b44112328644653c
|
7
|
+
data.tar.gz: 55e6b2168f84b5115ab428264efeefb87cb1d0e1f301c6040af13fe8595f4b1f82fbfa9392f63180df0f5c0aec4cc26bc2f158d0936bbb2daeb497f5644cc58f
|
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 1.7.0 - 6-Apr-2014
|
2
|
+
* The wait3 and wait4 methods no longer set $? to a custom struct. The builtin
|
3
|
+
variable is still set, but if you need the custom Struct::ProcStat information
|
4
|
+
then use the $last_status global instead, or just use the return value. This
|
5
|
+
was changed thanks to an issue pointed out by Michael Lee Squires where
|
6
|
+
subsequent system calls no longer set $? properly.
|
7
|
+
* Some build warning fixes for BSD platforms.
|
8
|
+
* Some test updates for BSD and Solaris.
|
9
|
+
|
1
10
|
== 1.6.0 - 28-Aug-2011
|
2
11
|
* Removed the getrlimit and setrlimit methods. Ruby has supported these methods
|
3
12
|
since Ruby 1.8.5, so I think it's time to finally dump them.
|
data/README
CHANGED
data/Rakefile
CHANGED
@@ -3,7 +3,7 @@ require 'rake/clean'
|
|
3
3
|
require 'rake/testtask'
|
4
4
|
require 'fileutils'
|
5
5
|
require 'rbconfig'
|
6
|
-
include
|
6
|
+
include RbConfig
|
7
7
|
|
8
8
|
CLEAN.include(
|
9
9
|
'**/*.gem', # Gem files
|
@@ -20,7 +20,7 @@ task :build => [:clean] do |t|
|
|
20
20
|
Dir.chdir('ext') do
|
21
21
|
ruby 'extconf.rb'
|
22
22
|
sh 'make'
|
23
|
-
FileUtils.mv 'wait3.' +
|
23
|
+
FileUtils.mv 'wait3.' + RbConfig::CONFIG['DLEXT'], 'proc'
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -28,7 +28,12 @@ namespace :gem do
|
|
28
28
|
desc "Create the proc-wait3 gem"
|
29
29
|
task :create => [:clean] do
|
30
30
|
spec = eval(IO.read('proc-wait3.gemspec'))
|
31
|
-
Gem::
|
31
|
+
if Gem::VERSION < "2.0"
|
32
|
+
Gem::Builder.new(spec).build
|
33
|
+
else
|
34
|
+
require 'rubygems/package'
|
35
|
+
Gem::Package.build(spec)
|
36
|
+
end
|
32
37
|
end
|
33
38
|
|
34
39
|
desc "Install the proc-wait3 gem"
|
data/doc/wait3.txt
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
== Description
|
2
2
|
Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to
|
3
|
-
the Process module.
|
4
|
-
and setrlimit methods.
|
3
|
+
the Process module.
|
5
4
|
|
6
5
|
== Synopsis
|
7
6
|
require 'proc/wait3'
|
@@ -33,12 +32,14 @@ Proc.wait3(flags=0)
|
|
33
32
|
Delays its caller until a signal is received or one of its child processes
|
34
33
|
terminates or stops due to tracing.
|
35
34
|
|
36
|
-
The return value is a ProcStat structure
|
37
|
-
set. Raises a SystemError if there
|
35
|
+
The return value is a ProcStat structure and sets the $last_status global
|
36
|
+
variable. The special global $? is also set. Raises a SystemError if there
|
37
|
+
are no child processes.
|
38
38
|
|
39
39
|
Proc.wait4(pid, flags=0)
|
40
40
|
Waits for the given child process to exit. Returns a ProcStat structure.
|
41
|
-
Also sets the $? special global
|
41
|
+
The $last_status global variable is set. Also sets the $? special global
|
42
|
+
variable.
|
42
43
|
|
43
44
|
Proc.waitid(id_type, id_num=nil, options=nil)
|
44
45
|
Suspends the calling process until one of its children changes state,
|
@@ -72,16 +73,6 @@ Proc.waitid(id_type, id_num=nil, options=nil)
|
|
72
73
|
|
73
74
|
Not supported on all platforms.
|
74
75
|
|
75
|
-
== Ruby 1.8.4 or earlier.
|
76
|
-
Process.getrlimit(resource) => [cur_limit, max_limit]
|
77
|
-
Returns a two element array consisting of the hard and soft limit
|
78
|
-
for the current process for the given +resource+. The array consists of
|
79
|
-
either numeric values or the word "infinite".
|
80
|
-
|
81
|
-
Process.setrlimit(resource, current, max=nil) => nil
|
82
|
-
Sets the resource limit for +resource+ to +current+ for the soft limit and
|
83
|
-
+max+ for the hard limit, or to +current+ if +max+ is nil.
|
84
|
-
|
85
76
|
== Constants
|
86
77
|
=== Standard
|
87
78
|
Process::WAIT3_VERSION
|
@@ -179,14 +170,14 @@ Process::RLIM_SAVED_MAX
|
|
179
170
|
struct.
|
180
171
|
|
181
172
|
== Known Bugs
|
182
|
-
None that I'm aware of. Please log any bugs on the
|
183
|
-
page at
|
173
|
+
None that I'm aware of. Please log any bugs on the Github project
|
174
|
+
page at https://github.com/djberg96/proc-wait3.
|
184
175
|
|
185
176
|
== License
|
186
177
|
Artistic 2.0
|
187
178
|
|
188
179
|
== Copyright
|
189
|
-
(C) 2003-
|
180
|
+
(C) 2003-2014 Daniel J. Berger
|
190
181
|
All Rights Reserved.
|
191
182
|
|
192
183
|
== Warranty
|
data/ext/extconf.rb
CHANGED
@@ -44,6 +44,7 @@ have_func('strlcpy')
|
|
44
44
|
# wait4, waitid, etc, are optional (HPUX, et al)
|
45
45
|
have_func('wait4')
|
46
46
|
have_func('waitid')
|
47
|
+
have_func('sigset')
|
47
48
|
have_func('sigsend')
|
48
49
|
have_func('getrusage')
|
49
50
|
have_func('getdtablesize')
|
@@ -64,7 +65,20 @@ have_struct_member('struct siginfo', 'si_stime', 'signal.h')
|
|
64
65
|
|
65
66
|
have_const('P_CID', 'signal.h')
|
66
67
|
have_const('P_GID', 'signal.h')
|
67
|
-
have_const('P_MYID', 'signal.
|
68
|
+
have_const('P_MYID', 'signal.hclass PasswdStruct < FFI::Struct
|
69
|
+
layout(
|
70
|
+
:pw_name, :string,
|
71
|
+
:pw_passwd, :string,
|
72
|
+
:pw_uid, :uint,
|
73
|
+
:pw_gid, :uint,
|
74
|
+
:pw_change, :ulong,
|
75
|
+
:pw_class, :string,
|
76
|
+
:pw_gecos, :string,
|
77
|
+
:pw_dir, :string,
|
78
|
+
:pw_shell, :string,
|
79
|
+
:pw_expire, :ulong
|
80
|
+
)
|
81
|
+
end')
|
68
82
|
have_const('P_SID', 'signal.h')
|
69
83
|
have_const('P_UID', 'signal.h')
|
70
84
|
|
data/ext/proc/wait3.c
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
#include <sys/wait.h>
|
10
10
|
#endif
|
11
11
|
|
12
|
-
#
|
12
|
+
#if defined(HAVE_WAITID) || defined(HAVE_SIGSET)
|
13
13
|
#include <signal.h>
|
14
14
|
#endif
|
15
15
|
|
@@ -65,10 +65,10 @@ static VALUE pst_wifstopped(int status)
|
|
65
65
|
*/
|
66
66
|
static VALUE pst_wifsignaled(int status)
|
67
67
|
{
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
68
|
+
if (WIFSIGNALED(status))
|
69
|
+
return Qtrue;
|
70
|
+
else
|
71
|
+
return Qfalse;
|
72
72
|
}
|
73
73
|
|
74
74
|
/*
|
@@ -77,10 +77,10 @@ static VALUE pst_wifsignaled(int status)
|
|
77
77
|
*/
|
78
78
|
static VALUE pst_wifexited(int status)
|
79
79
|
{
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
80
|
+
if (WIFEXITED(status))
|
81
|
+
return Qtrue;
|
82
|
+
else
|
83
|
+
return Qfalse;
|
84
84
|
}
|
85
85
|
|
86
86
|
/*
|
@@ -89,9 +89,10 @@ static VALUE pst_wifexited(int status)
|
|
89
89
|
*/
|
90
90
|
static VALUE pst_success_p(int status)
|
91
91
|
{
|
92
|
-
|
93
|
-
|
94
|
-
|
92
|
+
if (!WIFEXITED(status))
|
93
|
+
return Qnil;
|
94
|
+
|
95
|
+
return WEXITSTATUS(status) == EXIT_SUCCESS ? Qtrue : Qfalse;
|
95
96
|
}
|
96
97
|
|
97
98
|
/*
|
@@ -101,12 +102,12 @@ static VALUE pst_success_p(int status)
|
|
101
102
|
static VALUE pst_wcoredump(int status)
|
102
103
|
{
|
103
104
|
#ifdef WCOREDUMP
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
if (WCOREDUMP(status))
|
106
|
+
return Qtrue;
|
107
|
+
else
|
108
|
+
return Qfalse;
|
108
109
|
#else
|
109
|
-
|
110
|
+
return Qfalse;
|
110
111
|
#endif
|
111
112
|
}
|
112
113
|
|
@@ -116,9 +117,10 @@ static VALUE pst_wcoredump(int status)
|
|
116
117
|
*/
|
117
118
|
static VALUE pst_wexitstatus(int status)
|
118
119
|
{
|
119
|
-
|
120
|
-
|
121
|
-
|
120
|
+
if (WIFEXITED(status))
|
121
|
+
return INT2NUM(WEXITSTATUS(status));
|
122
|
+
|
123
|
+
return Qnil;
|
122
124
|
}
|
123
125
|
|
124
126
|
/*
|
@@ -127,9 +129,10 @@ static VALUE pst_wexitstatus(int status)
|
|
127
129
|
*/
|
128
130
|
static VALUE pst_wtermsig(int status)
|
129
131
|
{
|
130
|
-
|
131
|
-
|
132
|
-
|
132
|
+
if (WIFSIGNALED(status))
|
133
|
+
return INT2NUM(WTERMSIG(status));
|
134
|
+
|
135
|
+
return Qnil;
|
133
136
|
}
|
134
137
|
|
135
138
|
/*
|
@@ -138,9 +141,10 @@ static VALUE pst_wtermsig(int status)
|
|
138
141
|
*/
|
139
142
|
static VALUE pst_wstopsig(int status)
|
140
143
|
{
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
+
if(WIFSTOPPED(status))
|
145
|
+
return INT2NUM(WSTOPSIG(status));
|
146
|
+
|
147
|
+
return Qnil;
|
144
148
|
}
|
145
149
|
|
146
150
|
/*
|
@@ -200,6 +204,10 @@ static VALUE proc_wait3(int argc, VALUE *argv, VALUE mod){
|
|
200
204
|
pst_wtermsig(status),
|
201
205
|
pst_wstopsig(status)
|
202
206
|
);
|
207
|
+
|
208
|
+
rb_last_status_set(status, pid);
|
209
|
+
OBJ_FREEZE(v_last_status);
|
210
|
+
|
203
211
|
return v_last_status;
|
204
212
|
}
|
205
213
|
else{
|
@@ -268,6 +276,10 @@ static VALUE proc_wait4(int argc, VALUE *argv, VALUE mod){
|
|
268
276
|
pst_wtermsig(status),
|
269
277
|
pst_wstopsig(status)
|
270
278
|
);
|
279
|
+
|
280
|
+
rb_last_status_set(status, pid);
|
281
|
+
OBJ_FREEZE(v_last_status);
|
282
|
+
|
271
283
|
return v_last_status;
|
272
284
|
}
|
273
285
|
else{
|
@@ -670,36 +682,36 @@ static void sigproc(int signum){ /* Do nothing */ }
|
|
670
682
|
* Any non-system process whose effective user ID is equal to +id+.
|
671
683
|
*/
|
672
684
|
static VALUE proc_sigsend(int argc, VALUE* argv, VALUE mod){
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
685
|
+
VALUE v_type, v_pid, v_signal;
|
686
|
+
idtype_t idtype;
|
687
|
+
id_t id;
|
688
|
+
int sig = 0; /* 0 is our default signal (i.e. no signal) */
|
677
689
|
|
678
|
-
|
690
|
+
rb_scan_args(argc, argv, "21", &v_type, &v_pid, &v_signal);
|
679
691
|
|
680
|
-
|
681
|
-
|
692
|
+
idtype = NUM2INT(v_type);
|
693
|
+
id = NUM2INT(v_pid);
|
682
694
|
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
695
|
+
if(!NIL_P(v_signal)){
|
696
|
+
if(TYPE(v_signal) == T_FIXNUM){
|
697
|
+
sig = FIX2INT(v_signal);
|
698
|
+
}
|
699
|
+
else{
|
700
|
+
char signame[SIG2STR_MAX];
|
701
|
+
unsigned int max = SIG2STR_MAX;
|
690
702
|
|
691
|
-
|
692
|
-
|
703
|
+
if(strlcpy(signame, StringValuePtr(v_signal), max) >= max)
|
704
|
+
rb_raise(rb_eArgError, "string too large");
|
693
705
|
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
706
|
+
if(str2sig(signame,&sig) != 0)
|
707
|
+
rb_sys_fail("str2sig");
|
708
|
+
}
|
709
|
+
}
|
698
710
|
|
699
|
-
|
700
|
-
|
711
|
+
if(sigsend(idtype,id,sig) != 0)
|
712
|
+
rb_sys_fail("sigsend");
|
701
713
|
|
702
|
-
|
714
|
+
return Qnil;
|
703
715
|
}
|
704
716
|
#endif
|
705
717
|
|
@@ -709,8 +721,8 @@ static VALUE proc_sigsend(int argc, VALUE* argv, VALUE mod){
|
|
709
721
|
* Process.getrusage(children=false)
|
710
722
|
*
|
711
723
|
* Returns comprehensive process resource usage information in the form of a
|
712
|
-
* RUsage struct.
|
713
|
-
* process.
|
724
|
+
* RUsage struct. By default, this will return information for the current
|
725
|
+
* process. If +children+ is set to true, it will return information for
|
714
726
|
* terminated and waited for children of the current process.
|
715
727
|
*
|
716
728
|
* The RUsage struct contains the following members:
|
@@ -735,36 +747,36 @@ static VALUE proc_sigsend(int argc, VALUE* argv, VALUE mod){
|
|
735
747
|
* Note that not all members contain meaningful values on all platforms.
|
736
748
|
*/
|
737
749
|
static VALUE proc_getrusage(int argc, VALUE* argv, VALUE mod){
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
750
|
+
VALUE v_children = Qfalse;
|
751
|
+
struct rusage r;
|
752
|
+
int who = RUSAGE_SELF;
|
753
|
+
|
754
|
+
rb_scan_args(argc, argv, "01", &v_children);
|
755
|
+
|
756
|
+
if(RTEST(v_children))
|
757
|
+
who = RUSAGE_CHILDREN;
|
758
|
+
|
759
|
+
if(getrusage(who,&r) == -1)
|
760
|
+
rb_sys_fail("getrusage");
|
761
|
+
|
762
|
+
return rb_struct_new(v_usage_struct,
|
763
|
+
rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
|
764
|
+
rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
|
765
|
+
LONG2NUM(r.ru_maxrss),
|
766
|
+
LONG2NUM(r.ru_ixrss),
|
767
|
+
LONG2NUM(r.ru_idrss),
|
768
|
+
LONG2NUM(r.ru_isrss),
|
769
|
+
LONG2NUM(r.ru_minflt),
|
770
|
+
LONG2NUM(r.ru_majflt),
|
771
|
+
LONG2NUM(r.ru_nswap),
|
772
|
+
LONG2NUM(r.ru_inblock),
|
773
|
+
LONG2NUM(r.ru_oublock),
|
774
|
+
LONG2NUM(r.ru_msgsnd),
|
775
|
+
LONG2NUM(r.ru_msgrcv),
|
776
|
+
LONG2NUM(r.ru_nsignals),
|
777
|
+
LONG2NUM(r.ru_nvcsw),
|
778
|
+
LONG2NUM(r.ru_nivcsw)
|
779
|
+
);
|
768
780
|
}
|
769
781
|
#endif
|
770
782
|
|
@@ -778,7 +790,7 @@ static VALUE proc_getrusage(int argc, VALUE* argv, VALUE mod){
|
|
778
790
|
* as the resource identifier.
|
779
791
|
*/
|
780
792
|
static VALUE proc_getdtablesize(VALUE mod){
|
781
|
-
|
793
|
+
return INT2FIX(getdtablesize());
|
782
794
|
}
|
783
795
|
#endif
|
784
796
|
|
@@ -949,9 +961,9 @@ void Init_wait3()
|
|
949
961
|
rb_define_const(rb_mProcess, "P_PROJID", INT2FIX(P_PROJID));
|
950
962
|
#endif
|
951
963
|
|
952
|
-
/* 1.
|
953
|
-
rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_new2("1.
|
964
|
+
/* 1.7.0: The version of the proc-wait3 library */
|
965
|
+
rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_new2("1.7.0"));
|
954
966
|
|
955
967
|
/* Define this last in our Init_wait3 function */
|
956
|
-
rb_define_readonly_variable("
|
968
|
+
rb_define_readonly_variable("$last_status", &v_last_status);
|
957
969
|
}
|
data/proc-wait3.gemspec
CHANGED
@@ -2,21 +2,20 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'proc-wait3'
|
5
|
-
spec.version = '1.
|
5
|
+
spec.version = '1.7.0'
|
6
6
|
spec.author = 'Daniel J. Berger'
|
7
7
|
spec.license = 'Artistic 2.0'
|
8
8
|
spec.email = 'djberg96@gmail.com'
|
9
|
-
spec.homepage = '
|
10
|
-
spec.platform = Gem::Platform::RUBY
|
9
|
+
spec.homepage = 'https://github.com/djberg96/proc-wait3'
|
11
10
|
spec.summary = 'Adds wait3, wait4 and other methods to the Process module'
|
12
11
|
spec.test_file = 'test/test_proc_wait3.rb'
|
13
12
|
spec.extensions = ['ext/extconf.rb']
|
14
13
|
spec.files = Dir['**/*'].reject{ |f| f.include?('git') }
|
15
14
|
|
16
|
-
spec.rubyforge_project = 'shards'
|
17
15
|
spec.extra_rdoc_files = ['CHANGES', 'README', 'MANIFEST', 'ext/proc/wait3.c']
|
18
16
|
|
19
|
-
spec.add_development_dependency('test-unit'
|
17
|
+
spec.add_development_dependency('test-unit')
|
18
|
+
spec.add_development_dependency('rake')
|
20
19
|
|
21
20
|
spec.description = <<-EOF
|
22
21
|
The proc-wait3 library adds the wait3, wait4, waitid, pause, sigsend,
|
data/test/test_proc_wait3.rb
CHANGED
@@ -4,21 +4,17 @@
|
|
4
4
|
# Test suite for the Ruby proc-wait3 package. You should run this
|
5
5
|
# via the 'test' rake task.
|
6
6
|
##################################################################
|
7
|
-
require 'rubygems'
|
8
|
-
gem 'test-unit'
|
9
|
-
|
10
7
|
require 'proc/wait3'
|
11
|
-
require 'test
|
8
|
+
require 'test-unit'
|
12
9
|
require 'rbconfig'
|
13
10
|
|
14
|
-
class TC_Proc_Wait3 < Test::Unit::TestCase
|
11
|
+
class TC_Proc_Wait3 < Test::Unit::TestCase
|
15
12
|
def self.startup
|
16
|
-
@@solaris =
|
17
|
-
@@darwin =
|
18
|
-
@@hpux =
|
19
|
-
@@linux =
|
20
|
-
@@freebsd =
|
21
|
-
@@old_ruby = RUBY_VERSION.split('.').last.to_i < 5
|
13
|
+
@@solaris = RbConfig::CONFIG['host_os'] =~ /sunos|solaris/i
|
14
|
+
@@darwin = RbConfig::CONFIG['host_os'] =~ /darwin|osx/i
|
15
|
+
@@hpux = RbConfig::CONFIG['host_os'] =~ /hpux/i
|
16
|
+
@@linux = RbConfig::CONFIG['host_os'] =~ /linux/i
|
17
|
+
@@freebsd = RbConfig::CONFIG['host_os'] =~ /bsd/i
|
22
18
|
end
|
23
19
|
|
24
20
|
def setup
|
@@ -36,31 +32,50 @@ class TC_Proc_Wait3 < Test::Unit::TestCase
|
|
36
32
|
end
|
37
33
|
end
|
38
34
|
|
39
|
-
|
40
|
-
assert_equal('1.
|
35
|
+
test "version constant is set to expected value" do
|
36
|
+
assert_equal('1.7.0', Process::WAIT3_VERSION)
|
41
37
|
end
|
42
38
|
|
43
|
-
|
39
|
+
test "wait3 method is defined" do
|
44
40
|
assert_respond_to(Process, :wait3)
|
45
41
|
end
|
46
42
|
|
47
|
-
|
48
|
-
|
43
|
+
test "wait3 works as expected" do
|
44
|
+
fork{ sleep 0.5 }
|
49
45
|
assert_nothing_raised{ Process.wait3 }
|
50
46
|
end
|
51
47
|
|
52
|
-
|
53
|
-
|
48
|
+
test "wait3 returns the expected proc status membes" do
|
49
|
+
fork{ sleep 0.5 }
|
54
50
|
assert_nothing_raised{ @proc_stat = Process.wait3 }
|
55
51
|
assert_equal(@proc_stat_members, @proc_stat.members)
|
56
52
|
end
|
57
53
|
|
58
|
-
|
59
|
-
|
54
|
+
test "wait3 with WNOHANG works as expected" do
|
55
|
+
fork{ sleep 0.5 }
|
60
56
|
assert_nothing_raised{ Process.wait3(Process::WNOHANG) }
|
61
57
|
end
|
62
58
|
|
63
|
-
|
59
|
+
test "wait3 sets and returns $last_status to expected values" do
|
60
|
+
fork{ sleep 0.5 }
|
61
|
+
Process.wait3
|
62
|
+
assert_kind_of(Struct::ProcStat, $last_status)
|
63
|
+
assert_not_nil($last_status)
|
64
|
+
end
|
65
|
+
|
66
|
+
test "wait3 sets pid and status members of $?" do
|
67
|
+
fork{ sleep 0.5 }
|
68
|
+
Process.wait3
|
69
|
+
assert_not_nil($?)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "wait3 returns frozen struct" do
|
73
|
+
fork{ sleep 0.5 }
|
74
|
+
struct = Process.wait3
|
75
|
+
assert_true(struct.frozen?)
|
76
|
+
end
|
77
|
+
|
78
|
+
test "getdtablesize works as expected" do
|
64
79
|
omit_unless(@@solaris, 'getdtablesize skipped on this platform')
|
65
80
|
|
66
81
|
assert_respond_to(Process, :getdtablesize)
|
@@ -68,74 +83,100 @@ class TC_Proc_Wait3 < Test::Unit::TestCase
|
|
68
83
|
assert(Process.getdtablesize > 0)
|
69
84
|
end
|
70
85
|
|
71
|
-
|
86
|
+
test "wait4 method is defined" do
|
72
87
|
omit_if(@@hpux, 'wait4 test skipped on this platform')
|
73
|
-
|
74
88
|
assert_respond_to(Process,:wait4)
|
75
|
-
assert_raises(ArgumentError){ Process.wait4 } # Must have at least 1 arg
|
76
89
|
end
|
77
90
|
|
78
|
-
|
91
|
+
test "wait4 requires at least one argument" do
|
92
|
+
assert_raises(ArgumentError){ Process.wait4 }
|
93
|
+
end
|
94
|
+
|
95
|
+
test "wait4 works as expected" do
|
79
96
|
omit_if(@@hpux, 'wait4 test skipped on this platform')
|
80
97
|
|
81
|
-
pid = fork{ sleep
|
82
|
-
assert_nothing_raised{ @proc_stat = Process.wait4(pid) }
|
98
|
+
pid = fork{ sleep 0.5 }
|
99
|
+
assert_nothing_raised{ @proc_stat = Process.wait4(pid) }
|
83
100
|
assert_kind_of(Struct::ProcStat, @proc_stat)
|
84
101
|
end
|
85
102
|
|
86
|
-
|
87
|
-
|
103
|
+
test "wait4 sets and returns $last_status to expected values" do
|
104
|
+
pid = fork{ sleep 0.5 }
|
105
|
+
Process.wait4(pid)
|
106
|
+
assert_kind_of(Struct::ProcStat, $last_status)
|
107
|
+
assert_not_nil($last_status)
|
108
|
+
end
|
88
109
|
|
89
|
-
|
110
|
+
test "wait4 sets pid and status members of $?" do
|
111
|
+
pid = fork{ sleep 0.5 }
|
112
|
+
Process.wait4(pid)
|
113
|
+
assert_not_nil($?)
|
114
|
+
end
|
115
|
+
|
116
|
+
test "wait4 returns frozen struct" do
|
117
|
+
pid = fork{ sleep 0.5 }
|
118
|
+
struct = Process.wait4(pid)
|
119
|
+
assert_true(struct.frozen?)
|
90
120
|
end
|
91
121
|
|
92
|
-
|
122
|
+
test "waitid method is defined" do
|
93
123
|
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
94
|
-
|
124
|
+
assert_respond_to(Process, :waitid)
|
125
|
+
end
|
95
126
|
|
127
|
+
test "waitid method works as expected" do
|
128
|
+
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
129
|
+
pid = fork{ sleep 0.5 }
|
96
130
|
assert_nothing_raised{ Process.waitid(Process::P_PID, pid, Process::WEXITED) }
|
97
131
|
end
|
98
132
|
|
99
|
-
|
133
|
+
test "waitid method raises expected errors if wrong argument type is passed" do
|
100
134
|
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
101
|
-
pid = fork{ sleep
|
102
|
-
|
135
|
+
pid = fork{ sleep 0.5 }
|
103
136
|
assert_raises(TypeError){ Process.waitid("foo", pid, Process::WEXITED) }
|
104
137
|
assert_raises(TypeError){ Process.waitid(Process::P_PID, pid, "foo") }
|
105
138
|
assert_raises(TypeError){ Process.waitid(Process::P_PID, "foo", Process::WEXITED) }
|
139
|
+
end
|
140
|
+
|
141
|
+
test "waitid method raises expected error if invalid argument is passed" do
|
142
|
+
omit_if(@@hpux || @@darwin || @@freebsd, 'waitid test skipped on this platform')
|
143
|
+
fork{ sleep 0.5 }
|
106
144
|
assert_raises(Errno::ECHILD, Errno::EINVAL){ Process.waitid(Process::P_PID, 99999999, Process::WEXITED) }
|
107
145
|
end
|
108
146
|
|
109
|
-
|
147
|
+
test "sigsend method is defined" do
|
110
148
|
omit_unless(@@solaris, 'sigsend test skipped on this platform')
|
111
149
|
assert_respond_to(Process, :sigsend)
|
112
150
|
end
|
113
151
|
|
114
|
-
|
152
|
+
test "sigsend works as expected" do
|
115
153
|
omit_unless(@@solaris, 'sigsend test skipped on this platform')
|
116
|
-
pid = fork{ sleep
|
117
|
-
|
154
|
+
pid = fork{ sleep 0.5 }
|
118
155
|
assert_nothing_raised{ Process.sigsend(Process::P_PID, pid, 0) }
|
119
156
|
end
|
120
157
|
|
121
|
-
|
158
|
+
test "getrusage method is defined" do
|
122
159
|
assert_respond_to(Process, :getrusage)
|
123
160
|
end
|
124
161
|
|
125
|
-
|
126
|
-
|
162
|
+
test "getrusage works as expected" do
|
163
|
+
fork{ sleep 0.5 }
|
127
164
|
assert_nothing_raised{ Process.getrusage }
|
128
165
|
assert_nothing_raised{ Process.getrusage(true) }
|
166
|
+
end
|
167
|
+
|
168
|
+
test "getrusage returns the expected struct" do
|
169
|
+
fork{ sleep 0.5 }
|
129
170
|
assert_kind_of(Struct::RUsage, Process.getrusage)
|
130
171
|
assert_kind_of(Float, Process.getrusage.stime)
|
131
172
|
assert_kind_of(Float, Process.getrusage.utime)
|
132
173
|
end
|
133
174
|
|
134
|
-
|
175
|
+
test "pause method is defined" do
|
135
176
|
assert_respond_to(Process, :pause)
|
136
177
|
end
|
137
178
|
|
138
|
-
|
179
|
+
test "expected constants are defined" do
|
139
180
|
omit_if(@@darwin || @@freebsd, 'wait constant check skipped on this platform')
|
140
181
|
|
141
182
|
assert_not_nil(Process::WCONTINUED)
|
@@ -147,78 +188,20 @@ class TC_Proc_Wait3 < Test::Unit::TestCase
|
|
147
188
|
assert_not_nil(Process::WTRAPPED)
|
148
189
|
end
|
149
190
|
|
150
|
-
|
151
|
-
omit_unless(@@old_ruby, 'getrlimit test skipped on recent versions of Ruby')
|
152
|
-
|
153
|
-
assert_respond_to(Process, :getrlimit)
|
154
|
-
assert_nothing_raised{ Process.getrlimit(Process::RLIMIT_CPU) }
|
155
|
-
assert_kind_of(Array, Process.getrlimit(Process::RLIMIT_CPU))
|
156
|
-
assert_equal(2, Process.getrlimit(Process::RLIMIT_CPU).length)
|
157
|
-
end
|
158
|
-
|
159
|
-
def test_setrlimit
|
160
|
-
omit_unless(@@old_ruby, 'setrlimit test skipped on recent versions of Ruby')
|
161
|
-
|
162
|
-
assert_respond_to(Process, :setrlimit)
|
163
|
-
assert_nothing_raised{
|
164
|
-
Process.setrlimit(
|
165
|
-
Process::RLIMIT_CPU,
|
166
|
-
Process::RLIM_SAVED_CUR,
|
167
|
-
Process::RLIM_SAVED_MAX
|
168
|
-
)
|
169
|
-
}
|
170
|
-
|
171
|
-
assert_nothing_raised{
|
172
|
-
Process.setrlimit(Process::RLIMIT_CPU, Process::RLIM_SAVED_CUR)
|
173
|
-
}
|
174
|
-
end
|
175
|
-
|
176
|
-
# Test to ensure that the various rlimit constants are defined. Note that
|
177
|
-
# as of Ruby 1.8.5 these are defined by Ruby itself, except for the
|
178
|
-
# RLIMIT_VMEM constant, which is platform dependent.
|
179
|
-
#
|
180
|
-
def test_rlimit_constants
|
181
|
-
assert_not_nil(Process::RLIMIT_AS)
|
182
|
-
assert_not_nil(Process::RLIMIT_CORE)
|
183
|
-
assert_not_nil(Process::RLIMIT_CPU)
|
184
|
-
assert_not_nil(Process::RLIMIT_DATA)
|
185
|
-
assert_not_nil(Process::RLIMIT_FSIZE)
|
186
|
-
assert_not_nil(Process::RLIMIT_NOFILE)
|
187
|
-
assert_not_nil(Process::RLIMIT_STACK)
|
188
|
-
assert_not_nil(Process::RLIM_INFINITY)
|
189
|
-
end
|
190
|
-
|
191
|
-
def test_nonstandard_rlimit_constants
|
192
|
-
omit_unless(@@old_ruby, 'nonstandard rlimit constant tests skipped on recent versions of Ruby')
|
193
|
-
assert_not_nil(Process::RLIM_SAVED_MAX)
|
194
|
-
assert_not_nil(Process::RLIM_SAVED_CUR)
|
195
|
-
end
|
196
|
-
|
197
|
-
# This test was added to ensure that these three constants are being
|
198
|
-
# defined properly after an issue appeared on Linux with regards to
|
199
|
-
# the value accidentally being assigned a negative value.
|
200
|
-
#
|
201
|
-
def test_rlimit_constants_valid
|
202
|
-
omit_unless(@@old_ruby, 'valid rlimit constant tests skipped on recent versions of Ruby')
|
203
|
-
assert(Process::RLIM_INFINITY > 0)
|
204
|
-
assert(Process::RLIM_SAVED_MAX > 0)
|
205
|
-
assert(Process::RLIM_SAVED_CUR > 0)
|
206
|
-
end
|
207
|
-
|
208
|
-
def test_process_type_flags
|
191
|
+
test "expected process type flag constants are defined" do
|
209
192
|
omit_if(@@linux || @@darwin || @@freebsd, 'process type flag check skipped on this platform')
|
210
193
|
|
211
194
|
assert_not_nil(Process::P_ALL)
|
212
195
|
assert_not_nil(Process::P_CID)
|
213
196
|
assert_not_nil(Process::P_GID)
|
214
|
-
assert_not_nil(Process::P_MYID)
|
197
|
+
assert_not_nil(Process::P_MYID) unless @@solaris
|
215
198
|
assert_not_nil(Process::P_PGID)
|
216
|
-
assert_not_nil(Process::P_PID)
|
217
|
-
assert_not_nil(Process::P_SID)
|
199
|
+
assert_not_nil(Process::P_PID)
|
200
|
+
assert_not_nil(Process::P_SID)
|
218
201
|
assert_not_nil(Process::P_UID)
|
219
202
|
end
|
220
203
|
|
221
|
-
|
204
|
+
test "solaris-specific process type flags are defined on solaris" do
|
222
205
|
omit_unless(@@solaris, 'P_TASKID and P_PROJID constant check skipped on this platform')
|
223
206
|
|
224
207
|
assert_not_nil(Process::P_TASKID)
|
@@ -236,6 +219,5 @@ class TC_Proc_Wait3 < Test::Unit::TestCase
|
|
236
219
|
@@hpux = nil
|
237
220
|
@@linux = nil
|
238
221
|
@@freebsd = nil
|
239
|
-
@@old_ruby = nil
|
240
222
|
end
|
241
|
-
end
|
223
|
+
end
|
metadata
CHANGED
@@ -1,50 +1,60 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: proc-wait3
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
segments:
|
6
|
-
- 1
|
7
|
-
- 6
|
8
|
-
- 0
|
9
|
-
version: 1.6.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.7.0
|
10
5
|
platform: ruby
|
11
|
-
authors:
|
6
|
+
authors:
|
12
7
|
- Daniel J. Berger
|
13
8
|
autorequire:
|
14
9
|
bindir: bin
|
15
10
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
11
|
+
date: 2014-04-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
21
14
|
name: test-unit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
22
21
|
prerelease: false
|
23
|
-
|
24
|
-
|
25
|
-
requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
26
24
|
- - ">="
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
33
34
|
type: :development
|
34
|
-
|
35
|
-
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: |2
|
42
|
+
The proc-wait3 library adds the wait3, wait4, waitid, pause, sigsend,
|
43
|
+
and getrusage methods to the Process module.
|
36
44
|
email: djberg96@gmail.com
|
37
45
|
executables: []
|
38
|
-
|
39
|
-
extensions:
|
46
|
+
extensions:
|
40
47
|
- ext/extconf.rb
|
41
|
-
extra_rdoc_files:
|
48
|
+
extra_rdoc_files:
|
42
49
|
- CHANGES
|
43
50
|
- README
|
44
51
|
- MANIFEST
|
45
52
|
- ext/proc/wait3.c
|
46
|
-
files:
|
53
|
+
files:
|
47
54
|
- CHANGES
|
55
|
+
- MANIFEST
|
56
|
+
- README
|
57
|
+
- Rakefile
|
48
58
|
- doc/wait3.txt
|
49
59
|
- examples/example_getrusage.rb
|
50
60
|
- examples/example_pause.rb
|
@@ -53,42 +63,31 @@ files:
|
|
53
63
|
- examples/example_waitid.rb
|
54
64
|
- ext/extconf.rb
|
55
65
|
- ext/proc/wait3.c
|
56
|
-
- MANIFEST
|
57
66
|
- proc-wait3.gemspec
|
58
|
-
- Rakefile
|
59
|
-
- README
|
60
67
|
- test/test_proc_wait3.rb
|
61
|
-
|
62
|
-
|
63
|
-
licenses:
|
68
|
+
homepage: https://github.com/djberg96/proc-wait3
|
69
|
+
licenses:
|
64
70
|
- Artistic 2.0
|
71
|
+
metadata: {}
|
65
72
|
post_install_message:
|
66
73
|
rdoc_options: []
|
67
|
-
|
68
|
-
require_paths:
|
74
|
+
require_paths:
|
69
75
|
- lib
|
70
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
-
|
72
|
-
requirements:
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
73
78
|
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
|
-
requirements:
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
81
83
|
- - ">="
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
- 0
|
85
|
-
version: "0"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
86
|
requirements: []
|
87
|
-
|
88
|
-
|
89
|
-
rubygems_version: 1.3.7
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 2.2.2
|
90
89
|
signing_key:
|
91
|
-
specification_version:
|
90
|
+
specification_version: 4
|
92
91
|
summary: Adds wait3, wait4 and other methods to the Process module
|
93
|
-
test_files:
|
92
|
+
test_files:
|
94
93
|
- test/test_proc_wait3.rb
|