1 /* include serv08 */
2 #include	"unpthread.h"
3 #include	"pthread08.h"
4 
5 static int			nthreads;
6 pthread_mutex_t		clifd_mutex = PTHREAD_MUTEX_INITIALIZER;
7 pthread_cond_t		clifd_cond = PTHREAD_COND_INITIALIZER;
8 
9 int
main(int argc,char ** argv)10 main(int argc, char **argv)
11 {
12 	int			i, listenfd, connfd;
13 	void		sig_int(int), thread_make(int);
14 	socklen_t	addrlen, clilen;
15 	struct sockaddr	*cliaddr;
16 
17 	if (argc == 3)
18 		listenfd = Tcp_listen(NULL, argv[1], &addrlen);
19 	else if (argc == 4)
20 		listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
21 	else
22 		err_quit("usage: serv08 [ <host> ] <port#> <#threads>");
23 	cliaddr = Malloc(addrlen);
24 
25 	nthreads = atoi(argv[argc-1]);
26 	tptr = Calloc(nthreads, sizeof(Thread));
27 	iget = iput = 0;
28 
29 		/* 4create all the threads */
30 	for (i = 0; i < nthreads; i++)
31 		thread_make(i);		/* only main thread returns */
32 
33 	Signal(SIGINT, sig_int);
34 
35 	for ( ; ; ) {
36 		clilen = addrlen;
37 		connfd = Accept(listenfd, cliaddr, &clilen);
38 
39 		Pthread_mutex_lock(&clifd_mutex);
40 		clifd[iput] = connfd;
41 		if (++iput == MAXNCLI)
42 			iput = 0;
43 		if (iput == iget)
44 			err_quit("iput = iget = %d", iput);
45 		Pthread_cond_signal(&clifd_cond);
46 		Pthread_mutex_unlock(&clifd_mutex);
47 	}
48 }
49 /* end serv08 */
50 
51 void
sig_int(int signo)52 sig_int(int signo)
53 {
54 	int		i;
55 	void	pr_cpu_time(void);
56 
57 	pr_cpu_time();
58 
59 	for (i = 0; i < nthreads; i++)
60 		printf("thread %d, %ld connections\n", i, tptr[i].thread_count);
61 
62 	exit(0);
63 }
64