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