Home | History | Annotate | Line # | Download | only in h_client
h_stresscli.c revision 1.1
      1  1.1  pooka /*	$NetBSD: h_stresscli.c,v 1.1 2010/11/30 22:09:15 pooka Exp $	*/
      2  1.1  pooka 
      3  1.1  pooka #include <sys/types.h>
      4  1.1  pooka #include <sys/atomic.h>
      5  1.1  pooka #include <sys/sysctl.h>
      6  1.1  pooka #include <sys/wait.h>
      7  1.1  pooka 
      8  1.1  pooka #include <err.h>
      9  1.1  pooka #include <pthread.h>
     10  1.1  pooka #include <stdio.h>
     11  1.1  pooka #include <stdlib.h>
     12  1.1  pooka #include <string.h>
     13  1.1  pooka #include <unistd.h>
     14  1.1  pooka 
     15  1.1  pooka #include <rump/rump_syscalls.h>
     16  1.1  pooka #include <rump/rumpclient.h>
     17  1.1  pooka 
     18  1.1  pooka static unsigned int syscalls;
     19  1.1  pooka static pid_t mypid;
     20  1.1  pooka 
     21  1.1  pooka static void
     22  1.1  pooka signaali(int sig)
     23  1.1  pooka {
     24  1.1  pooka 
     25  1.1  pooka 	membar_consumer();
     26  1.1  pooka 	printf("process did %d syscalls\n", syscalls);
     27  1.1  pooka 	_exit(0);
     28  1.1  pooka }
     29  1.1  pooka 
     30  1.1  pooka static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
     31  1.1  pooka static char hostnamebuf[128];
     32  1.1  pooka #define HOSTNAMEBASE "rumpclient"
     33  1.1  pooka 
     34  1.1  pooka static void *
     35  1.1  pooka client(void *arg)
     36  1.1  pooka {
     37  1.1  pooka 	char buf[256];
     38  1.1  pooka 	size_t blen;
     39  1.1  pooka 
     40  1.1  pooka 	for (;;) {
     41  1.1  pooka 		pid_t pidi;
     42  1.1  pooka 		blen = sizeof(buf);
     43  1.1  pooka 		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
     44  1.1  pooka 		    buf, &blen, NULL, 0) == -1)
     45  1.1  pooka 			err(1, "sysctl");
     46  1.1  pooka 		if (strncmp(buf, hostnamebuf, sizeof(HOSTNAMEBASE)-1) != 0)
     47  1.1  pooka 			errx(1, "hostname (%s/%s) mismatch", buf, hostnamebuf);
     48  1.1  pooka 		atomic_inc_uint(&syscalls);
     49  1.1  pooka 
     50  1.1  pooka 		pidi = rump_sys_getpid();
     51  1.1  pooka 		if (pidi == -1)
     52  1.1  pooka 			err(1, "getpid");
     53  1.1  pooka 		if (pidi != mypid)
     54  1.1  pooka 			errx(1, "mypid mismatch");
     55  1.1  pooka 		atomic_inc_uint(&syscalls);
     56  1.1  pooka 	}
     57  1.1  pooka 
     58  1.1  pooka 	return NULL;
     59  1.1  pooka }
     60  1.1  pooka 
     61  1.1  pooka /* Stress with max 32 clients, 8 threads each (256 concurrent threads) */
     62  1.1  pooka #define NCLI 32
     63  1.1  pooka #define NTHR 8
     64  1.1  pooka 
     65  1.1  pooka int
     66  1.1  pooka main(int argc, char *argv[])
     67  1.1  pooka {
     68  1.1  pooka 	pthread_t pt;
     69  1.1  pooka 	pid_t clis[NCLI];
     70  1.1  pooka 	pid_t apid;
     71  1.1  pooka 	int ncli = 0;
     72  1.1  pooka 	int i = 0, j;
     73  1.1  pooka 	int status;
     74  1.1  pooka 	int rounds;
     75  1.1  pooka 
     76  1.1  pooka 	if (argc != 2)
     77  1.1  pooka 		errx(1, "need roundcount");
     78  1.1  pooka 
     79  1.1  pooka 	memset(clis, 0, sizeof(clis));
     80  1.1  pooka 	for (rounds = 1; rounds < atoi(argv[1])*10; rounds++) {
     81  1.1  pooka 		while (ncli < NCLI) {
     82  1.1  pooka 			switch ((apid = fork())) {
     83  1.1  pooka 			case -1:
     84  1.1  pooka 				err(1, "fork failed");
     85  1.1  pooka 			case 0:
     86  1.1  pooka 				if (rumpclient_init() == -1)
     87  1.1  pooka 					err(1, "rumpclient init");
     88  1.1  pooka 
     89  1.1  pooka 				mypid = rump_sys_getpid();
     90  1.1  pooka 				sprintf(hostnamebuf, HOSTNAMEBASE "%d", mypid);
     91  1.1  pooka 				if (rump_sys___sysctl(hostnamemib,
     92  1.1  pooka 				    __arraycount(hostnamemib), NULL, NULL,
     93  1.1  pooka 				    hostnamebuf, strlen(hostnamebuf)+1) == -1)
     94  1.1  pooka 					err(1, "sethostname");
     95  1.1  pooka 
     96  1.1  pooka 				signal(SIGUSR1, signaali);
     97  1.1  pooka 
     98  1.1  pooka 				for (j = 0; j < NTHR-1; j++)
     99  1.1  pooka 					if (pthread_create(&pt, NULL,
    100  1.1  pooka 					    client, NULL) != 0)
    101  1.1  pooka 						err(1, "pthread create");
    102  1.1  pooka 				client(NULL);
    103  1.1  pooka 				/* NOTREACHED */
    104  1.1  pooka 			default:
    105  1.1  pooka 				ncli++;
    106  1.1  pooka 				clis[i] = apid;
    107  1.1  pooka 				break;
    108  1.1  pooka 			}
    109  1.1  pooka 
    110  1.1  pooka 			i = (i + 1) % NCLI;
    111  1.1  pooka 		}
    112  1.1  pooka 
    113  1.1  pooka 		usleep(100000);
    114  1.1  pooka 		kill(clis[i], SIGUSR1);
    115  1.1  pooka 
    116  1.1  pooka 		apid = wait(&status);
    117  1.1  pooka 		if (apid != clis[i])
    118  1.1  pooka 			errx(1, "wanted pid %d, got %d\n", clis[i], apid);
    119  1.1  pooka 		clis[i] = 0;
    120  1.1  pooka 		ncli--;
    121  1.1  pooka 	}
    122  1.1  pooka 
    123  1.1  pooka 	for (i = 0; i < NCLI; i++)
    124  1.1  pooka 		if (clis[i])
    125  1.1  pooka 			kill(clis[i], SIGKILL);
    126  1.1  pooka }
    127