xref: /freebsd-src/contrib/netbsd-tests/rump/rumpkern/h_client/h_reconcli.c (revision 9268022b74279434ed6300244e3f977e56a8ceb5)
1*57718be8SEnji Cooper /*	$NetBSD: h_reconcli.c,v 1.2 2011/02/19 09:56:45 pooka Exp $	*/
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper #include <sys/types.h>
4*57718be8SEnji Cooper #include <sys/sysctl.h>
5*57718be8SEnji Cooper 
6*57718be8SEnji Cooper #include <rump/rumpclient.h>
7*57718be8SEnji Cooper #include <rump/rump_syscalls.h>
8*57718be8SEnji Cooper 
9*57718be8SEnji Cooper #include <err.h>
10*57718be8SEnji Cooper #include <pthread.h>
11*57718be8SEnji Cooper #include <stdio.h>
12*57718be8SEnji Cooper #include <stdlib.h>
13*57718be8SEnji Cooper #include <string.h>
14*57718be8SEnji Cooper #include <unistd.h>
15*57718be8SEnji Cooper 
16*57718be8SEnji Cooper static volatile int quit, riseandwhine;
17*57718be8SEnji Cooper 
18*57718be8SEnji Cooper static pthread_mutex_t closermtx;
19*57718be8SEnji Cooper static pthread_cond_t closercv;
20*57718be8SEnji Cooper 
21*57718be8SEnji Cooper static void *
closer(void * arg)22*57718be8SEnji Cooper closer(void *arg)
23*57718be8SEnji Cooper {
24*57718be8SEnji Cooper 
25*57718be8SEnji Cooper 	pthread_mutex_lock(&closermtx);
26*57718be8SEnji Cooper 	while (!quit) {
27*57718be8SEnji Cooper 		while (!riseandwhine)
28*57718be8SEnji Cooper 			pthread_cond_wait(&closercv, &closermtx);
29*57718be8SEnji Cooper 		riseandwhine = 0;
30*57718be8SEnji Cooper 		pthread_mutex_unlock(&closermtx);
31*57718be8SEnji Cooper 
32*57718be8SEnji Cooper 		/* try to catch a random slot */
33*57718be8SEnji Cooper 		usleep(random() % 100000);
34*57718be8SEnji Cooper 
35*57718be8SEnji Cooper 		/*
36*57718be8SEnji Cooper 		 * wide-angle disintegration beam, but takes care
37*57718be8SEnji Cooper 		 * of the client rumpkernel communication socket.
38*57718be8SEnji Cooper 		 */
39*57718be8SEnji Cooper 		closefrom(3);
40*57718be8SEnji Cooper 
41*57718be8SEnji Cooper 		pthread_mutex_lock(&closermtx);
42*57718be8SEnji Cooper 	}
43*57718be8SEnji Cooper 	pthread_mutex_unlock(&closermtx);
44*57718be8SEnji Cooper 
45*57718be8SEnji Cooper 	return NULL;
46*57718be8SEnji Cooper }
47*57718be8SEnji Cooper 
48*57718be8SEnji Cooper static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
49*57718be8SEnji Cooper static char goodhostname[128];
50*57718be8SEnji Cooper 
51*57718be8SEnji Cooper static void *
worker(void * arg)52*57718be8SEnji Cooper worker(void *arg)
53*57718be8SEnji Cooper {
54*57718be8SEnji Cooper 	char hostnamebuf[128];
55*57718be8SEnji Cooper 	size_t blen;
56*57718be8SEnji Cooper 
57*57718be8SEnji Cooper 	pthread_mutex_lock(&closermtx);
58*57718be8SEnji Cooper 	while (!quit) {
59*57718be8SEnji Cooper 		pthread_mutex_unlock(&closermtx);
60*57718be8SEnji Cooper 		if (rump_sys_getpid() == -1)
61*57718be8SEnji Cooper 			err(1, "getpid");
62*57718be8SEnji Cooper 
63*57718be8SEnji Cooper 		blen = sizeof(hostnamebuf);
64*57718be8SEnji Cooper 		memset(hostnamebuf, 0, sizeof(hostnamebuf));
65*57718be8SEnji Cooper 		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
66*57718be8SEnji Cooper 		    hostnamebuf, &blen, NULL, 0) == -1)
67*57718be8SEnji Cooper 			err(1, "sysctl");
68*57718be8SEnji Cooper 		if (strcmp(hostnamebuf, goodhostname) != 0)
69*57718be8SEnji Cooper 			exit(1);
70*57718be8SEnji Cooper 		pthread_mutex_lock(&closermtx);
71*57718be8SEnji Cooper 		riseandwhine = 1;
72*57718be8SEnji Cooper 		pthread_cond_signal(&closercv);
73*57718be8SEnji Cooper 	}
74*57718be8SEnji Cooper 	riseandwhine = 1;
75*57718be8SEnji Cooper 	pthread_cond_signal(&closercv);
76*57718be8SEnji Cooper 	pthread_mutex_unlock(&closermtx);
77*57718be8SEnji Cooper 
78*57718be8SEnji Cooper 	return NULL;
79*57718be8SEnji Cooper }
80*57718be8SEnji Cooper 
81*57718be8SEnji Cooper int
main(int argc,char * argv[])82*57718be8SEnji Cooper main(int argc, char *argv[])
83*57718be8SEnji Cooper {
84*57718be8SEnji Cooper 	pthread_t pt, w1, w2, w3, w4;
85*57718be8SEnji Cooper 	size_t blen;
86*57718be8SEnji Cooper 	int timecount;
87*57718be8SEnji Cooper 
88*57718be8SEnji Cooper 	if (argc != 2)
89*57718be8SEnji Cooper 		errx(1, "need timecount");
90*57718be8SEnji Cooper 	timecount = atoi(argv[1]);
91*57718be8SEnji Cooper 	if (timecount <= 0)
92*57718be8SEnji Cooper 		errx(1, "invalid timecount %d\n", timecount);
93*57718be8SEnji Cooper 
94*57718be8SEnji Cooper 	srandom(time(NULL));
95*57718be8SEnji Cooper 
96*57718be8SEnji Cooper 	rumpclient_setconnretry(RUMPCLIENT_RETRYCONN_INFTIME);
97*57718be8SEnji Cooper 	if (rumpclient_init() == -1)
98*57718be8SEnji Cooper 		err(1, "init");
99*57718be8SEnji Cooper 
100*57718be8SEnji Cooper 	blen = sizeof(goodhostname);
101*57718be8SEnji Cooper 	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
102*57718be8SEnji Cooper 	    goodhostname, &blen, NULL, 0) == -1)
103*57718be8SEnji Cooper 		err(1, "sysctl");
104*57718be8SEnji Cooper 
105*57718be8SEnji Cooper 	pthread_create(&pt, NULL, closer, NULL);
106*57718be8SEnji Cooper 	pthread_create(&w1, NULL, worker, NULL);
107*57718be8SEnji Cooper 	pthread_create(&w2, NULL, worker, NULL);
108*57718be8SEnji Cooper 	pthread_create(&w3, NULL, worker, NULL);
109*57718be8SEnji Cooper 	pthread_create(&w4, NULL, worker, NULL);
110*57718be8SEnji Cooper 
111*57718be8SEnji Cooper 	sleep(timecount);
112*57718be8SEnji Cooper 	quit = 1;
113*57718be8SEnji Cooper 
114*57718be8SEnji Cooper 	pthread_join(pt, NULL);
115*57718be8SEnji Cooper 	pthread_join(w1, NULL);
116*57718be8SEnji Cooper 	pthread_join(w2, NULL);
117*57718be8SEnji Cooper 	pthread_join(w3, NULL);
118*57718be8SEnji Cooper 	pthread_join(w4, NULL);
119*57718be8SEnji Cooper 
120*57718be8SEnji Cooper 	exit(0);
121*57718be8SEnji Cooper }
122