bjh         99/07/12 01:47:48

  Modified:    mpm/src/include ap_config.h
               mpm/src/os/os2 iol_socket.c util_os2.c
  Log:
  OS/2 EMX library's select() isn't thread safe so bypass it and go direct to 
the
  OS/2 API call. Unfortunately this only works on socket handles which will
  break probe_writable_fds() so I'll have to find a way to fix that too.
  
  Revision  Changes    Path
  1.2       +2 -0      apache-2.0/mpm/src/include/ap_config.h
  
  Index: ap_config.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/include/ap_config.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ap_config.h       1999/06/18 18:39:27     1.1
  +++ ap_config.h       1999/07/12 08:47:47     1.2
  @@ -1163,6 +1163,8 @@
   #elif defined(SELECT_NEEDS_CAST)
   #define ap_select(_a, _b, _c, _d, _e)   \
       select((_a), (int *)(_b), (int *)(_c), (int *)(_d), (_e))
  +#elif defined(OS2)
  +int ap_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set 
*exceptfds, struct timeval *timeout);
   #else
   #define ap_select(_a, _b, _c, _d, _e)   \
        select(_a, _b, _c, _d, _e)
  
  
  
  1.2       +1 -1      apache-2.0/mpm/src/os/os2/iol_socket.c
  
  Index: iol_socket.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/os/os2/iol_socket.c,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- iol_socket.c      1999/07/11 14:49:07     1.1
  +++ iol_socket.c      1999/07/12 08:47:47     1.2
  @@ -140,7 +140,7 @@
        tv.tv_sec = iol->timeout; \
        tv.tv_usec = 0; \
        do { \
  -         rv = select(iol->fd + 1, selread, selwrite, NULL, iol->timeout < 0 
? NULL : &tv); \
  +         rv = ap_select(iol->fd + 1, selread, selwrite, NULL, iol->timeout < 
0 ? NULL : &tv); \
        } while (rv == -1 && errno == EINTR); \
        if (!FD_ISSET(iol->fd, &fdset)) { \
            errno = ETIMEDOUT; \
  
  
  
  1.3       +91 -0     apache-2.0/mpm/src/os/os2/util_os2.c
  
  Index: util_os2.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/mpm/src/os/os2/util_os2.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- util_os2.c        1999/07/11 14:49:07     1.2
  +++ util_os2.c        1999/07/12 08:47:48     1.3
  @@ -94,3 +94,94 @@
     
     return result;
   }
  +
  +
  +
  +
  +int (*os2_select)( int *, int, int, int, long ) = NULL;
  +static HMODULE hSO32DLL;
  +
  +int ap_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set 
*exceptfds, struct timeval *timeout)
  +{
  +    int *fds, s, fd_count=0, rc;
  +    int num_read, num_write, num_except;
  +    long ms_timeout = -1;
  +
  +    if (os2_select == NULL) {
  +        DosEnterCritSec(); /* Stop two threads doing this at the same time */
  +
  +        if (os2_select == NULL) {
  +            hSO32DLL = ap_os_dso_load("SO32DLL");
  +
  +            if (hSO32DLL) {
  +                os2_select = ap_os_dso_sym(hSO32DLL, "SELECT");
  +            }
  +        }
  +        DosExitCritSec();
  +    }
  +
  +    ap_assert(os2_select != NULL);
  +    fds = alloca(sizeof(int) * nfds);
  +
  +    if (readfds) {
  +        for (s=0; s<nfds; s++)
  +            if (FD_ISSET(s, readfds))
  +                fds[fd_count++] = _getsockhandle(s);
  +    }
  +
  +    num_read = fd_count;
  +
  +    if (writefds) {
  +        for (s=0; s<nfds; s++)
  +            if (FD_ISSET(s, writefds))
  +                fds[fd_count++] = _getsockhandle(s);
  +    }
  +
  +    num_write = fd_count - num_read;
  +
  +    if (exceptfds) {
  +        for (s=0; s<nfds; s++)
  +            if (FD_ISSET(s, exceptfds))
  +                fds[fd_count++] = _getsockhandle(s);
  +    }
  +
  +    num_except = fd_count - num_read - num_write;
  +
  +    if (timeout)
  +        ms_timeout = timeout->tv_usec / 1000 + timeout->tv_sec * 1000;
  +
  +    rc = os2_select(fds, num_read, num_write, num_except, ms_timeout);
  +
  +    if (rc > 0) {
  +        fd_count = 0;
  +
  +        if (readfds) {
  +            for (s=0; s<nfds; s++) {
  +                if (FD_ISSET(s, readfds)) {
  +                    if (fds[fd_count++] < 0)
  +                        FD_CLR(s, readfds);
  +                }
  +            }
  +        }
  +
  +        if (writefds) {
  +            for (s=0; s<nfds; s++) {
  +                if (FD_ISSET(s, writefds)) {
  +                    if (fds[fd_count++] < 0)
  +                        FD_CLR(s, writefds);
  +                }
  +            }
  +        }
  +
  +        if (exceptfds) {
  +            for (s=0; s<nfds; s++) {
  +                if (FD_ISSET(s, exceptfds)) {
  +                    if (fds[fd_count++] < 0)
  +                        FD_CLR(s, exceptfds);
  +                }
  +            }
  +        }
  +    }
  +
  +    return rc;
  +}
  
  
  

Reply via email to