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 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 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