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);
  
  
  

Reply via email to