stoddard 99/09/07 13:37:25
Modified: src/main http_main.c Log: errno on WIN32 is not thread safe. Use h_errno (which resolves to WSAGetLastError) instead. Revision Changes Path 1.474 +22 -42 apache-1.3/src/main/http_main.c Index: http_main.c =================================================================== RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v retrieving revision 1.473 retrieving revision 1.474 diff -u -r1.473 -r1.474 --- http_main.c 1999/09/07 19:12:21 1.473 +++ http_main.c 1999/09/07 20:37:20 1.474 @@ -5586,40 +5586,28 @@ tv.tv_sec = wait_time; tv.tv_usec = 0; - memcpy(&main_fds, &listenfds, sizeof(fd_set)); + srv = ap_select(listenmaxfd + 1, &main_fds, NULL, NULL, &tv); -#ifdef WIN32 - if (srv == SOCKET_ERROR) { - /* Map the Win32 error into a standard Unix error condition */ - errno = WSAGetLastError(); - srv = -1; - } -#endif /* WIN32 */ - if (srv < 0) { - /* Error occurred - if EINTR, loop around with problem */ - if (errno != EINTR) { - /* A "real" error occurred, log it and increment the count of - * select errors. This count is used to ensure we don't go into - * a busy loop of continuous errors. - */ - ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, "select: (listen)"); - count_select_errors++; - if (count_select_errors > MAX_SELECT_ERRORS) { - ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, server_conf, - "Too many errors in select loop. Child process exiting."); - break; - } - } - continue; - } - count_select_errors = 0; /* reset count of errors */ - if (srv == 0) { + if (srv == 0 || (srv == SOCKET_ERROR && h_errno == WSAEINTR)) { + count_select_errors = 0; /* reset count of errors */ continue; - } - - { + } + else if (srv == SOCKET_ERROR) { + /* A "real" error occurred, log it and increment the count of + * select errors. This count is used to ensure we don't go into + * a busy loop of continuous errors. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf, + "select failed with errno %d", h_errno); + count_select_errors++; + if (count_select_errors > MAX_SELECT_ERRORS) { + ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, server_conf, + "Too many errors in select loop. Child process exiting."); + break; + } + } else { listen_rec *lr; lr = find_ready_listener(&main_fds); @@ -5630,24 +5618,16 @@ do { clen = sizeof(sa_client); csd = accept(sd, (struct sockaddr *) &sa_client, &clen); -#ifdef WIN32 if (csd == INVALID_SOCKET) { csd = -1; - errno = WSAGetLastError(); } -#endif /* WIN32 */ - } while (csd < 0 && errno == EINTR); + } while (csd < 0 && h_errno == WSAEINTR); if (csd < 0) { -#if defined(EPROTO) && defined(ECONNABORTED) - if ((errno != EPROTO) && (errno != ECONNABORTED)) -#elif defined(EPROTO) - if (errno != EPROTO) -#elif defined(ECONNABORTED) - if (errno != ECONNABORTED) -#endif + if (h_errno != WSAECONNABORTED) { ap_log_error(APLOG_MARK, APLOG_ERR, server_conf, - "accept: (client socket)"); + "accept: (client socket) failed with errno = %d",h_errno); + } } else { add_job(csd);