proc-wait3 1.5.2 → 1.5.3

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.
Files changed (5) hide show
  1. data/CHANGES +13 -0
  2. data/extconf.rb +6 -1
  3. data/lib/proc/wait3.c +109 -67
  4. data/test/tc_wait3.rb +16 -2
  5. metadata +2 -2
data/CHANGES CHANGED
@@ -1,3 +1,16 @@
1
+ == 1.5.3 - 25-Oct-2006
2
+ * Because not all platforms support automatically converting signal names
3
+ into their equivalent numbers, the Process.pause method now accepts names
4
+ or numbers. It will raise an ArgumentError if you try to use a signal name
5
+ on a platform that doesn't support the str2sig() function (such as Linux).
6
+ * Fixed a bug where fractional seconds for utime/stime were not reported in
7
+ the Process.getrusage method. Thanks go to Eric Hodel for the spot and
8
+ the patch.
9
+ * Fixed potential bigint overflow issues in the Process.getrusage method.
10
+ Thanks go again to Eric Hodel.
11
+ * Internal fixes for platforms that don't support the strlcpy() function.
12
+ * Minor update for the test_pause.rb example program.
13
+
1
14
  == 1.5.2 - 24-Jul-2006
2
15
  * Fixed the way I was handling whether or not Ruby already defined the various
3
16
  RLIMIT constants within wait3.c.
data/extconf.rb CHANGED
@@ -34,11 +34,16 @@ unless have_func("wait3")
34
34
  exit
35
35
  end
36
36
 
37
- # wait4 and waitid are optional (HPUX, et al)
37
+ # Yay, Linux
38
+ have_func("str2sig")
39
+ have_func("strlcpy")
40
+
41
+ # wait4, waitid, etc, are optional (HPUX, et al)
38
42
  have_func("wait4")
39
43
  have_func("waitid")
40
44
  have_func("sigsend")
41
45
  have_func("getrusage")
46
+ have_func("getdtablesize")
42
47
 
43
48
  have_struct_member("struct siginfo", "si_trapno", "signal.h")
44
49
  have_struct_member("struct siginfo", "si_pc", "signal.h")
data/lib/proc/wait3.c CHANGED
@@ -384,35 +384,35 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
384
384
  );
385
385
  }
386
386
  else{
387
- VALUE rbUtime = Qnil, rbStatus = Qnil, rbStime = Qnil, rbFD = Qnil;
387
+ VALUE v_utime = Qnil, v_status = Qnil, v_stime = Qnil, v_fd = Qnil;
388
388
  #ifdef HAVE_ST_SI_TRAPNO
389
- VALUE rbTrapno = Qnil;
389
+ VALUE v_trapno = Qnil;
390
390
  #endif
391
391
  #ifdef HAVE_ST_SI_PC
392
- VALUE rbPC = Qnil;
392
+ VALUE v_pc = Qnil;
393
393
  #endif
394
394
  #ifdef HAVE_ST_SI_FADDR
395
- VALUE rbFaddr = Qnil;
395
+ VALUE v_addr = Qnil;
396
396
  #endif
397
397
  #ifdef HAVE_ST_SI_TSTAMP
398
- VALUE rbTime = Qnil;
398
+ VALUE v_time = Qnil;
399
399
  #endif
400
400
  #ifdef HAVE_ST_SI_SYSCALL
401
- VALUE rbSyscall = Qnil;
401
+ VALUE v_syscall = Qnil;
402
402
  #endif
403
403
  #ifdef HAVE_ST_SI_NSYSARG
404
- VALUE rbNSysarg = Qnil;
404
+ VALUE v_nsysarg = Qnil;
405
405
  #endif
406
406
  #ifdef HAVE_ST_SI_FAULT
407
- VALUE rbFault = Qnil;
407
+ VALUE v_fault = Qnil;
408
408
  #endif
409
409
  #ifdef HAVE_ST_SI_SYSARG
410
- VALUE rbSysarg = Qnil;
410
+ VALUE v_sysarg = Qnil;
411
411
  #endif
412
412
  #ifdef HAVE_ST_SI_MSTATE
413
- VALUE rbMState = Qnil;
413
+ VALUE v_state = Qnil;
414
414
  #endif
415
- VALUE rbBand = Qnil, rbEntity = Qnil;
415
+ VALUE v_band = Qnil, v_entity = Qnil;
416
416
  int sig = infop.si_signo;
417
417
  int code = infop.si_code;
418
418
 
@@ -421,64 +421,64 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
421
421
  * the si_signo struct member will always be SIGCHLD.
422
422
  */
423
423
  if(sig == SIGCHLD){
424
- rbUtime = ULL2NUM(infop.si_utime);
425
- rbStatus = ULL2NUM(infop.si_status);
426
- rbStime = ULL2NUM(infop.si_stime);
424
+ v_utime = ULL2NUM(infop.si_utime);
425
+ v_status = ULL2NUM(infop.si_status);
426
+ v_stime = ULL2NUM(infop.si_stime);
427
427
  }
428
428
 
429
429
  if(sig == SIGBUS || sig == SIGFPE || sig == SIGILL || sig == SIGSEGV ||
430
430
  sig == SIGTRAP)
431
431
  {
432
432
  #ifdef HAVE_ST_SI_TRAPNO
433
- rbTrapno = INT2FIX(infop.si_trapno);
433
+ v_trapno = INT2FIX(infop.si_trapno);
434
434
  #endif
435
435
  #ifdef HAVE_ST_SI_PC
436
- rbPC = INT2FIX(infop.si_pc);
436
+ v_pc = INT2FIX(infop.si_pc);
437
437
  #endif
438
438
  }
439
439
 
440
440
  if(sig == SIGXFSZ){
441
- rbFD = INT2FIX(infop.si_fd);
441
+ v_fd = INT2FIX(infop.si_fd);
442
442
  if(code == POLL_IN || code == POLL_OUT || code == POLL_MSG){
443
- rbBand = LONG2FIX(infop.si_band);
443
+ v_band = LONG2FIX(infop.si_band);
444
444
  }
445
445
  }
446
446
 
447
447
  if(sig == SIGPROF){
448
448
  #ifdef HAVE_ST_SI_SYSARG
449
449
  int ssize = sizeof(infop.si_sysarg) / sizeof(infop.si_sysarg[0]);
450
- rbSysarg = rb_ary_new();
450
+ v_sysarg = rb_ary_new();
451
451
 
452
452
  for(i = 0; i < ssize; i++)
453
- rb_ary_push(rbSysarg, LONG2FIX(infop.si_sysarg[i]));
453
+ rb_ary_push(v_sysarg, LONG2FIX(infop.si_sysarg[i]));
454
454
  #endif
455
455
  #ifdef HAVE_ST_SI_MSTATE
456
456
  int msize = sizeof(infop.si_mstate) / sizeof(infop.si_mstate[0]);
457
- rbMState = rb_ary_new();
457
+ v_state = rb_ary_new();
458
458
 
459
459
  for(i = 0; i < msize; i++)
460
- rb_ary_push(rbMState, INT2FIX(infop.si_mstate[i]));
460
+ rb_ary_push(v_state, INT2FIX(infop.si_mstate[i]));
461
461
  #endif
462
462
  #ifdef HAVE_ST_SI_FADDR
463
- rbFaddr = INT2FIX(infop.si_faddr);
463
+ v_addr = INT2FIX(infop.si_faddr);
464
464
  #endif
465
465
  #ifdef HAVE_ST_SI_SYSCALL
466
- rbSyscall = INT2FIX(infop.si_syscall);
466
+ v_syscall = INT2FIX(infop.si_syscall);
467
467
  #endif
468
468
  #ifdef HAVE_ST_SI_NSYSARG
469
- rbNSysarg = INT2FIX(infop.si_nsysarg);
469
+ v_nsysarg = INT2FIX(infop.si_nsysarg);
470
470
  #endif
471
471
  #ifdef HAVE_ST_SI_FAULT
472
- rbFault = INT2FIX(infop.si_fault);
472
+ v_fault = INT2FIX(infop.si_fault);
473
473
  #endif
474
474
  #ifdef HAVE_ST_SI_TSTAMP
475
- rbTime = rb_time_new(infop.si_tstamp.tv_sec,infop.si_tstamp.tv_nsec);
475
+ v_time = rb_time_new(infop.si_tstamp.tv_sec,infop.si_tstamp.tv_nsec);
476
476
  #endif
477
477
  }
478
478
 
479
479
  #ifdef SIGXRES
480
480
  if(sig == SIGXRES){
481
- rbEntity = INT2FIX(infop.si_entity);
481
+ v_entity = INT2FIX(infop.si_entity);
482
482
  }
483
483
  #endif
484
484
 
@@ -488,39 +488,39 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
488
488
  INT2FIX(infop.si_code), /* Should be anything but SI_NOINFO */
489
489
  INT2FIX(infop.si_pid), /* Real PID that sent the signal */
490
490
  INT2FIX(infop.si_uid), /* Real UID of process that sent signal */
491
- rbUtime,
492
- rbStatus,
493
- rbStime,
491
+ v_utime,
492
+ v_status,
493
+ v_stime,
494
494
  #ifdef HAVE_ST_SI_TRAPNO
495
- rbTrapno,
495
+ v_trapno,
496
496
  #endif
497
497
  #ifdef HAVE_ST_SI_PC
498
- rbPC,
498
+ v_pc,
499
499
  #endif
500
- rbFD,
501
- rbBand,
500
+ v_fd,
501
+ v_band,
502
502
  #ifdef HAVE_ST_SI_FADDR
503
- rbFaddr,
503
+ v_addr,
504
504
  #endif
505
505
  #ifdef HAVE_ST_SI_TSTAMP
506
- rbTime,
506
+ v_time,
507
507
  #endif
508
508
  #ifdef HAVE_ST_SI_SYSCALL
509
- rbSyscall,
509
+ v_syscall,
510
510
  #endif
511
511
  #ifdef HAVE_ST_SI_NSYSARG
512
- rbNSysarg,
512
+ v_nsysarg,
513
513
  #endif
514
514
  #ifdef HAVE_ST_SI_FAULT
515
- rbFault,
515
+ v_fault,
516
516
  #endif
517
517
  #ifdef HAVE_ST_SI_SYSARG
518
- rbSysarg,
518
+ v_sysarg,
519
519
  #endif
520
520
  #ifdef HAVE_ST_SI_MSTATE
521
- rbMState,
521
+ v_state,
522
522
  #endif
523
- rbEntity
523
+ v_entity
524
524
  );
525
525
  }
526
526
 
@@ -536,8 +536,14 @@ static VALUE proc_waitid(int argc, VALUE* argv, VALUE mod){
536
536
  * you pass as arguments it will return from the pause and continue with
537
537
  * the execution of your code. Otherwise, it will exit.
538
538
  *
539
- * Note that you must leave out the 'SIG' prefix for the signal name, e.g.
540
- * use 'INT', not 'SIGINT'.
539
+ * The +signals+ argument can be an array of integers or strings (or a mix
540
+ * of each) which correspond to signals on your system. If a string is used,
541
+ * be sure to leave off the leading 'SIG' substring, e.g. use 'INT' instead
542
+ * of 'SIGINT'.
543
+ *
544
+ * Note that not all platforms (notably Linux) do not support automatically
545
+ * converting strings to their corresponding signal values, so it is
546
+ * recommended that you always use an array of numeric values.
541
547
  *
542
548
  * Returns the result of the pause() function, which should always be -1.
543
549
  */
@@ -558,11 +564,29 @@ static VALUE proc_pause(int argc, VALUE* argv, VALUE mod){
558
564
  for(i = 0; i < len; i++){
559
565
  v_val = rb_ary_shift(v_signals);
560
566
 
561
- if(strlcpy(signame, StringValuePtr(v_val), max) >= max)
562
- rb_raise(rb_eArgError, "string too large");
567
+ if(TYPE(v_val) == T_STRING){
568
+ #ifdef HAVE_STRLCPY
569
+ if(strlcpy(signame, StringValuePtr(v_val), max) >= max)
570
+ rb_raise(rb_eArgError, "string too large");
571
+ #else
572
+ if(RSTRING(v_val)->len > max)
573
+ rb_raise(rb_eArgError, "string too large");
574
+ else
575
+ strncpy(signame, RSTRING(v_val)->ptr, max);
576
+ #endif
563
577
 
564
- if(str2sig(signame, &signum) != 0)
565
- rb_sys_fail("pause");
578
+ #ifdef HAVE_STR2SIG
579
+ if(str2sig(signame, &signum) != 0)
580
+ rb_sys_fail("pause");
581
+ #else
582
+ rb_raise(rb_eArgError,
583
+ "platform does not support signal names - use numbers instead"
584
+ );
585
+ #endif
586
+ }
587
+ else{
588
+ signum = NUM2INT(v_val);
589
+ }
566
590
 
567
591
  sigset(signum, sigproc);
568
592
  }
@@ -688,29 +712,29 @@ static VALUE proc_getrusage(int argc, VALUE* argv, VALUE mod){
688
712
 
689
713
  rb_scan_args(argc, argv, "01", &v_children);
690
714
 
691
- if(Qtrue == v_children)
715
+ if(RTEST(v_children))
692
716
  who = RUSAGE_CHILDREN;
693
717
 
694
718
  if(getrusage(who,&r) == -1)
695
719
  rb_sys_fail("getrusage");
696
720
 
697
721
  return rb_struct_new(v_usage_struct,
698
- LONG2FIX(r.ru_utime.tv_sec),
699
- LONG2FIX(r.ru_stime.tv_sec),
700
- LONG2FIX(r.ru_maxrss),
701
- LONG2FIX(r.ru_ixrss),
702
- LONG2FIX(r.ru_idrss),
703
- LONG2FIX(r.ru_isrss),
704
- LONG2FIX(r.ru_minflt),
705
- LONG2FIX(r.ru_majflt),
706
- LONG2FIX(r.ru_nswap),
707
- LONG2FIX(r.ru_inblock),
708
- LONG2FIX(r.ru_oublock),
709
- LONG2FIX(r.ru_msgsnd),
710
- LONG2FIX(r.ru_msgrcv),
711
- LONG2FIX(r.ru_nsignals),
712
- LONG2FIX(r.ru_nvcsw),
713
- LONG2FIX(r.ru_nivcsw)
722
+ rb_float_new((double)r.ru_utime.tv_sec+(double)r.ru_utime.tv_usec/1e6),
723
+ rb_float_new((double)r.ru_stime.tv_sec+(double)r.ru_stime.tv_usec/1e6),
724
+ LONG2NUM(r.ru_maxrss),
725
+ LONG2NUM(r.ru_ixrss),
726
+ LONG2NUM(r.ru_idrss),
727
+ LONG2NUM(r.ru_isrss),
728
+ LONG2NUM(r.ru_minflt),
729
+ LONG2NUM(r.ru_majflt),
730
+ LONG2NUM(r.ru_nswap),
731
+ LONG2NUM(r.ru_inblock),
732
+ LONG2NUM(r.ru_oublock),
733
+ LONG2NUM(r.ru_msgsnd),
734
+ LONG2NUM(r.ru_msgrcv),
735
+ LONG2NUM(r.ru_nsignals),
736
+ LONG2NUM(r.ru_nvcsw),
737
+ LONG2NUM(r.ru_nivcsw)
714
738
  );
715
739
  }
716
740
  #endif
@@ -775,6 +799,20 @@ static VALUE proc_setrlimit(int argc, VALUE* argv, VALUE mod){
775
799
  }
776
800
  #endif
777
801
 
802
+ #ifdef HAVE_GETDTABLESIZE
803
+ /*
804
+ * call-seq:
805
+ * Process.getdtablesize
806
+ *
807
+ * Returns the current soft limit of the maximum file descriptor number. This
808
+ * is effectively the same as calling Process.getrlimit with RLIMIT_NOFILE
809
+ * as the resource identifier.
810
+ */
811
+ static VALUE proc_getdtablesize(VALUE mod){
812
+ return INT2FIX(getdtablesize());
813
+ }
814
+ #endif
815
+
778
816
  /*
779
817
  * Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the
780
818
  * Process module.
@@ -797,6 +835,10 @@ void Init_wait3()
797
835
  rb_define_module_function(rb_mProcess, "setrlimit", proc_setrlimit, -1);
798
836
  #endif
799
837
 
838
+ #ifdef HAVE_GETDTABLESIZE
839
+ rb_define_module_function(rb_mProcess,"getdtablesize",proc_getdtablesize,0);
840
+ #endif
841
+
800
842
  #ifdef HAVE_SIGSEND
801
843
  rb_define_module_function(rb_mProcess, "sigsend", proc_sigsend, -1);
802
844
  #endif
@@ -933,7 +975,7 @@ void Init_wait3()
933
975
  #endif
934
976
  #endif
935
977
 
936
- rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_new2("1.5.2"));
978
+ rb_define_const(rb_mProcess, "WAIT3_VERSION", rb_str_new2("1.5.3"));
937
979
 
938
980
  /* Define this last in our Init_wait3 function */
939
981
  rb_define_readonly_variable("$?", &v_last_status);
data/test/tc_wait3.rb CHANGED
@@ -32,11 +32,11 @@ class TC_Wait3 < Test::Unit::TestCase
32
32
  end
33
33
 
34
34
  def test_wait3_version
35
- assert_equal('1.5.2', Process::WAIT3_VERSION)
35
+ assert_equal('1.5.3', Process::WAIT3_VERSION)
36
36
  end
37
37
 
38
38
  def test_wait3_basic
39
- assert_respond_to(Process,:wait3)
39
+ assert_respond_to(Process, :wait3)
40
40
  end
41
41
 
42
42
  def test_wait3_no_args
@@ -55,6 +55,14 @@ class TC_Wait3 < Test::Unit::TestCase
55
55
  assert_nothing_raised{ Process.wait3(Process::WNOHANG) }
56
56
  end
57
57
 
58
+ if RUBY_PLATFORM =~ /solaris|sunos/i
59
+ def test_getdtablesize
60
+ assert_respond_to(Process, :getdtablesize)
61
+ assert_kind_of(Fixnum, Process.getdtablesize)
62
+ assert(Process.getdtablesize > 0)
63
+ end
64
+ end
65
+
58
66
  unless RUBY_PLATFORM =~ /hpux/i
59
67
  def test_wait4_basic
60
68
  assert_respond_to(Process,:wait4)
@@ -131,6 +139,12 @@ end
131
139
  assert_nothing_raised{ Process.getrusage }
132
140
  assert_nothing_raised{ Process.getrusage(true) }
133
141
  assert_kind_of(Struct::RUsage, Process.getrusage)
142
+ assert_kind_of(Float, Process.getrusage.stime)
143
+ assert_kind_of(Float, Process.getrusage.utime)
144
+ end
145
+
146
+ def test_pause
147
+ assert_respond_to(Process, :pause)
134
148
  end
135
149
 
136
150
  def test_wait_constants
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: proc-wait3
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.5.2
7
- date: 2006-07-24 00:00:00 -06:00
6
+ version: 1.5.3
7
+ date: 2006-10-25 00:00:00 -06:00
8
8
  summary: Adds the wait3, wait4, waitid, pause, sigsend, and getrusage methods to the Process module. It also adds the getrlimit and setrlimit methods for Ruby 1.8.4 or earlier.
9
9
  require_paths:
10
10
  - lib