lat_select.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * lat_select.c - time select system call
  3. *
  4. * usage: lat_select tcp|file [n]
  5. *
  6. * Copyright (c) 1996 Larry McVoy. Distributed under the FSF GPL with
  7. * additional restriction that results may published only if
  8. * (1) the benchmark is unmodified, and
  9. * (2) the version in the sccsid below is included in the report.
  10. */
  11. char *id = "$Id$\n";
  12. #include "bench.h"
  13. int nfds;
  14. fd_set set;
  15. void
  16. doit(int n, fd_set *set)
  17. {
  18. fd_set nosave = *set;
  19. static struct timeval tv;
  20. select(n, 0, &nosave, 0, &tv);
  21. }
  22. void
  23. sigterm(int sig)
  24. {
  25. int fid;
  26. for (fid = 0; fid < nfds; ++fid) {
  27. if (FD_ISSET(fid, &set)) {
  28. close(fid);
  29. }
  30. }
  31. tcp_done(TCP_SELECT);
  32. exit(0);
  33. }
  34. int
  35. main(int ac, char **av)
  36. {
  37. char c;
  38. int n, N, fd, fid;
  39. pid_t pid, ppid;
  40. char buf[L_tmpnam+256];
  41. char fname[L_tmpnam];
  42. char* report_file = "Select on %d fd's";
  43. char* report_tcp = "Select on %d tcp fd's";
  44. char* report;
  45. char* usage = "lat_select tcp|file [n]\n";
  46. morefds();
  47. N = 200;
  48. fname[0] = 0;
  49. pid = 0;
  50. c = 0;
  51. nfds = 0;
  52. FD_ZERO(&set);
  53. report = report_file;
  54. if (ac != 2 && ac != 3) {
  55. fprintf(stderr, usage);
  56. exit(1);
  57. }
  58. if (streq(av[1], "tcp")) {
  59. report = report_tcp;
  60. /* Create a socket for clients to connect to */
  61. fd = tcp_server(TCP_SELECT, SOCKOPT_REUSE);
  62. if (fd <= 0) {
  63. perror("lat_select: Could not open tcp server socket");
  64. exit(1);
  65. }
  66. /* Start server process to accept client connections */
  67. ppid = getpid();
  68. switch(pid = fork()) {
  69. case 0:
  70. /* child server process */
  71. if (signal(SIGTERM, sigterm) == SIG_ERR) {
  72. perror("signal(SIGTERM, sigterm) failed");
  73. exit(1);
  74. }
  75. FD_SET(fd, &set);
  76. while (ppid == getppid()) {
  77. int newsock = tcp_accept(fd, SOCKOPT_NONE);
  78. if (newsock >= nfds) nfds = newsock + 1;
  79. FD_SET(newsock, &set);
  80. }
  81. sigterm(SIGTERM);
  82. /* NOTREACHED */
  83. case -1:
  84. /* error */
  85. perror("lat_select::server(): fork() failed");
  86. exit(1);
  87. default:
  88. break;
  89. }
  90. close(fd);
  91. fd = tcp_connect("127.0.0.1", TCP_SELECT, SOCKOPT_NONE);
  92. if (fd <= 0) {
  93. perror("lat_select: Could not open socket");
  94. exit(1);
  95. }
  96. } else if (streq(av[1], "file")) {
  97. /* Create a temporary file for clients to open */
  98. tmpnam(fname);
  99. fd = open(fname, O_RDWR|O_APPEND|O_CREAT, 0666);
  100. unlink(fname);
  101. if (fd <= 0) {
  102. char buf[L_tmpnam+128];
  103. sprintf(buf,
  104. "lat_select: Could not create temp file %s", fname);
  105. perror(buf);
  106. exit(1);
  107. }
  108. } else {
  109. fprintf(stderr, usage);
  110. exit(1);
  111. }
  112. if (ac == 3) N = atoi(av[2]);
  113. for (n = 0; n < N; n++) {
  114. fid = dup(fd);
  115. if (fid == -1) break;
  116. if (fid >= nfds) nfds = fid + 1;
  117. FD_SET(fid, &set);
  118. }
  119. BENCH(doit(nfds, &set), 0);
  120. sprintf(buf, report, n);
  121. micro(buf, get_n());
  122. for (fid = 0; fid < nfds; fid++) {
  123. if (FD_ISSET(fid, &set)) {
  124. close(fid);
  125. }
  126. }
  127. close(fd);
  128. if (pid) kill(pid, SIGTERM);
  129. exit(0);
  130. }