On Win2K, I was having a consistent problem with ab in the last N iterations with concurrency N. For example, running "ab -n 20 -c 10 http://example.com/foo"; would consistently cause a poll error out after 13 or 15 requests. The message (errno == 9) was that poll was passed something that is not a socket.

Anyway, I tracked down the problem to the post-select handling. It doesn't quite match the pre-select handling. The attached patch makes it so. This patch is not platform-specific, but obviously only affects platforms w/out poll().

take it easy,
Charlie


*** poll.c Thu Sep 26 11:11:46 2002
--- /tmp/poll.c Tue Aug  6 17:06:12 2002
***************
*** 284,305 ****
      for (i = 0; i < num; i++) {
          apr_os_sock_t fd;
  
-         aprset[i].rtnevents = 0;
- 
          if (aprset[i].desc_type == APR_POLL_SOCKET) {
              fd = aprset[i].desc.s->socketdes;
          }
!         else  if (aprset[i].desc_type == APR_POLL_FILE) {
! #if APR_FILES_AS_SOCKETS
!             fd = aprset[i].desc.f->filedes;
! #else
              return APR_EBADF;
  #endif
          }
!         else if (aprset[i].desc_type == APR_NO_DESC) {
!             continue;
!         }
! 
          if (FD_ISSET(fd, &readset)) {
              aprset[i].rtnevents |= APR_POLLIN;
          }
--- 284,300 ----
      for (i = 0; i < num; i++) {
          apr_os_sock_t fd;
  
          if (aprset[i].desc_type == APR_POLL_SOCKET) {
              fd = aprset[i].desc.s->socketdes;
          }
!         else {
! #if !APR_FILES_AS_SOCKETS
              return APR_EBADF;
+ #else
+             fd = aprset[i].desc.f->filedes;
  #endif
          }
!         aprset[i].rtnevents = 0;
          if (FD_ISSET(fd, &readset)) {
              aprset[i].rtnevents |= APR_POLLIN;
          }

Reply via email to