1 /*
2 * exec1.c
3 *
4 * $DragonFly: src/test/sysperf/exec1.c,v 1.2 2004/04/14 17:59:45 dillon Exp $
5 */
6
7 #include "blib.h"
8 #include <sys/resource.h>
9 #include <sys/wait.h>
10 #include <sys/time.h>
11 #include <machine/atomic.h>
12
13 char *Av0;
14
15 static
16 void
execltest(void)17 execltest(void)
18 {
19 pid_t pid;
20 char *elm;
21
22 if ((elm = strrchr(Av0, '/')) == NULL)
23 elm = Av0;
24 else
25 ++elm;
26
27 if ((pid = vfork()) == 0) {
28 execl(Av0, elm, "dummy", NULL);
29 _exit(1);
30 } else if (pid < 0) {
31 perror("vfork");
32 exit(1);
33 } else {
34 int status;
35
36 while (waitpid(pid, &status, 0) != pid)
37 ;
38 if (WEXITSTATUS(status)) {
39 fprintf(stderr, "execl in child failed\n");
40 exit(1);
41 }
42 }
43 }
44
45 int
main(int ac,char ** av)46 main(int ac, char **av)
47 {
48 int i;
49 int count;
50 int status;
51 int ncpus;
52 int n;
53 long *countr;
54
55 countr = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
56
57 Av0 = av[0];
58 if (ac == 2 && strcmp(av[1], "dummy") == 0)
59 exit(0);
60 ncpus = 1;
61 if (ac > 1)
62 ncpus = strtol(av[1], NULL, 0);
63
64 count = 0;
65 start_timing();
66 while (stop_timing(0, NULL) == 0) {
67 for (i = 0; i < 100; ++i)
68 execltest();
69 count += 100;
70 }
71 count *= 5; /* 5 second run */
72 start_timing();
73 for (n = 0; n < ncpus; ++n) {
74 if (fork() == 0) {
75 count = 0;
76 while (get_timing() < 5000000) {
77 execltest();
78 ++count;
79 stop_timing(0, NULL);
80 }
81 atomic_add_long(countr, count);
82 _exit(0);
83 }
84 }
85 while (wait3(&status, 0, NULL) >= 0 || errno == EINTR)
86 ;
87 #ifdef ISSTATIC
88 stop_timing(*countr, "execl static program:");
89 #else
90 stop_timing(*countr, "execl dynamic program:");
91 #endif
92 return(0);
93 }
94
95