proc-wait3 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
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