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