serv08.c 1.3 KB

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