httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From b..@hyperreal.org
Subject cvs commit: apache-2.0/mpm/src/os/os2 iol_socket.c util_os2.c
Date Mon, 12 Jul 1999 08:47:48 GMT
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;
  +}
  
  
  

Mime
View raw message