xref: /xnu-12377.61.12/tools/tests/execperf/run.c (revision 4d495c6e23c53686cf65f45067f79024cf5dcee8)
1*4d495c6eSApple OSS Distributions #include <stdlib.h>
2*4d495c6eSApple OSS Distributions #include <stdio.h>
3*4d495c6eSApple OSS Distributions #include <unistd.h>
4*4d495c6eSApple OSS Distributions #include <stdint.h>
5*4d495c6eSApple OSS Distributions #include <errno.h>
6*4d495c6eSApple OSS Distributions #include <err.h>
7*4d495c6eSApple OSS Distributions #include <pthread.h>
8*4d495c6eSApple OSS Distributions #include <spawn.h>
9*4d495c6eSApple OSS Distributions 
10*4d495c6eSApple OSS Distributions extern char **environ;
11*4d495c6eSApple OSS Distributions 
12*4d495c6eSApple OSS Distributions char * const *newargv;
13*4d495c6eSApple OSS Distributions 
14*4d495c6eSApple OSS Distributions void usage(void);
15*4d495c6eSApple OSS Distributions 
16*4d495c6eSApple OSS Distributions void *work(void *);
17*4d495c6eSApple OSS Distributions 
18*4d495c6eSApple OSS Distributions int
main(int argc,char * argv[])19*4d495c6eSApple OSS Distributions main(int argc, char *argv[])
20*4d495c6eSApple OSS Distributions {
21*4d495c6eSApple OSS Distributions 	int i, count, threadcount;
22*4d495c6eSApple OSS Distributions 	int ret;
23*4d495c6eSApple OSS Distributions 	pthread_t *threads;
24*4d495c6eSApple OSS Distributions 
25*4d495c6eSApple OSS Distributions 	if (argc < 4) {
26*4d495c6eSApple OSS Distributions 		usage();
27*4d495c6eSApple OSS Distributions 	}
28*4d495c6eSApple OSS Distributions 
29*4d495c6eSApple OSS Distributions 	threadcount = atoi(argv[1]);
30*4d495c6eSApple OSS Distributions 	count = atoi(argv[2]);
31*4d495c6eSApple OSS Distributions 
32*4d495c6eSApple OSS Distributions 	newargv = &argv[3];
33*4d495c6eSApple OSS Distributions 
34*4d495c6eSApple OSS Distributions 	threads = (pthread_t *)calloc(threadcount, sizeof(pthread_t));
35*4d495c6eSApple OSS Distributions 	for (i = 0; i < threadcount; i++) {
36*4d495c6eSApple OSS Distributions 		ret = pthread_create(&threads[i], NULL, work, (void *)(intptr_t)count);
37*4d495c6eSApple OSS Distributions 		if (ret) {
38*4d495c6eSApple OSS Distributions 			err(1, "pthread_create");
39*4d495c6eSApple OSS Distributions 		}
40*4d495c6eSApple OSS Distributions 	}
41*4d495c6eSApple OSS Distributions 
42*4d495c6eSApple OSS Distributions 	for (i = 0; i < threadcount; i++) {
43*4d495c6eSApple OSS Distributions 		ret = pthread_join(threads[i], NULL);
44*4d495c6eSApple OSS Distributions 		if (ret) {
45*4d495c6eSApple OSS Distributions 			err(1, "pthread_join");
46*4d495c6eSApple OSS Distributions 		}
47*4d495c6eSApple OSS Distributions 	}
48*4d495c6eSApple OSS Distributions 
49*4d495c6eSApple OSS Distributions 	return 0;
50*4d495c6eSApple OSS Distributions }
51*4d495c6eSApple OSS Distributions 
52*4d495c6eSApple OSS Distributions void
usage(void)53*4d495c6eSApple OSS Distributions usage(void)
54*4d495c6eSApple OSS Distributions {
55*4d495c6eSApple OSS Distributions 	fprintf(stderr, "Usage: %s <threadcount> <count> <program> [<arg1> [<arg2> ...]]\n",
56*4d495c6eSApple OSS Distributions 	    getprogname());
57*4d495c6eSApple OSS Distributions 	exit(1);
58*4d495c6eSApple OSS Distributions }
59*4d495c6eSApple OSS Distributions 
60*4d495c6eSApple OSS Distributions void *
work(void * arg)61*4d495c6eSApple OSS Distributions work(void *arg)
62*4d495c6eSApple OSS Distributions {
63*4d495c6eSApple OSS Distributions 	int count = (int)(intptr_t)arg;
64*4d495c6eSApple OSS Distributions 	int i;
65*4d495c6eSApple OSS Distributions 	int ret;
66*4d495c6eSApple OSS Distributions 	pid_t pid;
67*4d495c6eSApple OSS Distributions 
68*4d495c6eSApple OSS Distributions 	for (i = 0; i < count; i++) {
69*4d495c6eSApple OSS Distributions 		ret = posix_spawn(&pid, newargv[0], NULL, NULL, newargv, environ);
70*4d495c6eSApple OSS Distributions 		if (ret != 0) {
71*4d495c6eSApple OSS Distributions 			errc(1, ret, "posix_spawn(%s)", newargv[0]);
72*4d495c6eSApple OSS Distributions 		}
73*4d495c6eSApple OSS Distributions 
74*4d495c6eSApple OSS Distributions 		while (-1 == waitpid(pid, &ret, 0)) {
75*4d495c6eSApple OSS Distributions 			if (errno != EINTR) {
76*4d495c6eSApple OSS Distributions 				err(1, "waitpid(%d)", pid);
77*4d495c6eSApple OSS Distributions 			}
78*4d495c6eSApple OSS Distributions 		}
79*4d495c6eSApple OSS Distributions 
80*4d495c6eSApple OSS Distributions 		if (WIFSIGNALED(ret)) {
81*4d495c6eSApple OSS Distributions 			errx(1, "process exited with signal %d", WTERMSIG(ret));
82*4d495c6eSApple OSS Distributions 		} else if (WIFSTOPPED(ret)) {
83*4d495c6eSApple OSS Distributions 			errx(1, "process stopped with signal %d", WSTOPSIG(ret));
84*4d495c6eSApple OSS Distributions 		} else if (WIFEXITED(ret)) {
85*4d495c6eSApple OSS Distributions 			if (WEXITSTATUS(ret) != 42) {
86*4d495c6eSApple OSS Distributions 				errx(1, "process exited with unexpected exit code %d", WEXITSTATUS(ret));
87*4d495c6eSApple OSS Distributions 			}
88*4d495c6eSApple OSS Distributions 		} else {
89*4d495c6eSApple OSS Distributions 			errx(1, "unknown exit condition %x", ret);
90*4d495c6eSApple OSS Distributions 		}
91*4d495c6eSApple OSS Distributions 	}
92*4d495c6eSApple OSS Distributions 
93*4d495c6eSApple OSS Distributions 	return NULL;
94*4d495c6eSApple OSS Distributions }
95