1use threads; 2use Time::HiRes qw(sleep); 3 4my %args = @ARGV; 5 6my $duration = $args{'-d'} || 35; 7 8if ($args{'-p'}) { 9# 10# fork some procs 11# 12 my $cnt = $ARGV[1] || 2; 13 my @procs = (); 14 for (1..$cnt) { 15 if (my $pid = fork()) { 16 push @procs, $pid; 17 } 18 elsif (defined($pid)) { 19 @procs = (); 20 runtest(); 21 last; 22 } 23 else { 24 die "Can't fork()\n"; 25 } 26 } 27 exit 1 unless scalar @procs; # must be a child 28 29 waitpid($procs[0], 0), 30 shift @procs 31 while (scalar @procs); 32} 33else { # use threads 34 my $cnt = $args{'-t'} || 2; 35 my @thrds = (); 36 $thrds[$_] = threads->create(\&runtest) 37 foreach (0..$cnt-1); 38 39 $thrds[$_]->join() 40# print "Joined thread $_\n" 41 foreach (0..$#thrds); 42# sleep 32; 43} 44 45sub runtest { 46# print STDERR "In runtest\n"; 47 my $callback = sub { 48 sleep 0.5; 49 return time(); 50 }; 51 52 my $started = time(); 53 my $count = 1; 54 while ((time() - $started) < $duration) { 55#print STDERR "Scan ", $count++, "for thread ", threads->self->tid, "\n"; 56 my @ret = array_ret(); 57# print "array_ret returned ", join(', ', @ret), "\n"; 58 my $ret = scalar_ret(); 59 void_ret(); 60 recurse_ret(1); 61 closure_ret($callback); 62 eval_ret('sleep 0.5; time();'); 63 } 64#print STDERR "Scan done for thread ", threads->self->tid, "\n"; 65 return 1; 66} 67 68sub closure_ret { 69 $_[0]->(); 70} 71 72sub eval_ret { 73 eval $_[0]; 74 return 1; 75} 76 77sub array_ret { 78 sleep 0.5; 79 return (1,2,3,4); 80} 81 82sub scalar_ret { 83 sleep 0.5; 84 return "scalar value"; 85} 86 87sub void_ret { 88 my $this = 'adffadfasdf'; 89 sleep 0.5; 90} 91 92sub recurse_ret { 93 sleep 0.5 unless $_[0] < 10; 94 return ($_[0] < 10) ? 95 recurse_ret($_[0]+1) : $_[0]; 96} 97