serv08.lc 2.9 KB

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