dreid       99/11/02 04:26:43

  Modified:    src/modules/mpm/mpmt_beos mpmt_beos.c
               src/os/beos iol_socket.c iol_socket.h
  Log:
  Change the BeOS iol_socket layer to use apr.  Also update mpmt_beos.c
  to reflect this change.
  
  Revision  Changes    Path
  1.7       +2 -6      apache-2.0/src/modules/mpm/mpmt_beos/mpmt_beos.c
  
  Index: mpmt_beos.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/mpm/mpmt_beos/mpmt_beos.c,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- mpmt_beos.c       1999/10/28 22:14:54     1.6
  +++ mpmt_beos.c       1999/11/02 12:26:41     1.7
  @@ -643,11 +643,7 @@
       long conn_id = my_child_num * HARD_THREAD_LIMIT + my_thread_num;
       int csd;
   
  -    ap_get_os_sock(&csd, sock);
  -
  -    sock_disable_nagle(csd);
  -
  -    iol = beos_attach_socket(csd);
  +    iol = beos_attach_socket(sock);
       if (iol == NULL) {
           if (errno == EBADF) {
               ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_WARNING, errno, 
NULL,
  @@ -659,7 +655,7 @@
               ap_log_error(APLOG_MARK, APLOG_WARNING, errno, NULL,
                   "error attaching to socket");
           }
  -        closesocket(csd);
  +        ap_close_socket(sock);
        return;
       }
   
  
  
  
  1.3       +26 -110   apache-2.0/src/os/beos/iol_socket.c
  
  Index: iol_socket.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/os/beos/iol_socket.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- iol_socket.c      1999/10/22 11:25:42     1.2
  +++ iol_socket.c      1999/11/02 12:26:42     1.3
  @@ -58,19 +58,15 @@
   
   #include "httpd.h"
   #include "ap_iol.h"
  +#include "apr_network_io.h"
  +#include "apr_file_io.h"
   #include "iol_socket.h"
   
  -#include <errno.h>
  -#include <sys/types.h>
  -#include <sys/uio.h>
  -
   #define FD_NONBLOCKING_SET   (1)
   
   typedef struct {
       ap_iol iol;
  -    int fd;
  -    int flags;
  -    int timeout;
  +    ap_socket_t *sock;
   } iol_socket;
   
   static ap_status_t beos_setopt(ap_iol *viol, ap_iol_option opt,
  @@ -80,10 +76,10 @@
   
       switch (opt) {
       case AP_IOL_TIMEOUT:
  -     iol->timeout = *(const int *)value;
  -     break;
  +        ap_setsocketopt(iol->sock, APR_SO_TIMEOUT, *(const int*)value);
  +        break;
       default:
  -     return APR_EINVAL;
  +         return APR_EINVAL;
       }
       return APR_SUCCESS;
   }
  @@ -94,116 +90,42 @@
   
       switch (opt) {
       case AP_IOL_TIMEOUT:
  -     *(int *)value = iol->timeout;
  -     break;
  +     /* no-op */
  +         break;
       default:
  -     return APR_EINVAL;
  +         return APR_EINVAL;
       }
       return APR_SUCCESS;
   }
   
  -static ap_status_t set_nonblock(int fd)
  +ap_status_t beos_write(ap_iol *viol, const char* buf, ap_size_t size,
  +     ap_ssize_t *nbytes)
   {
  -    int on = 1;
  -    int rv;
  -    rv = setsockopt(fd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int));
  -    
  -    if (rv == 0)
  -        return APR_SUCCESS;
  -    return errno;
  +    *nbytes = size;
  +    return ap_send(((iol_socket *)viol)->sock, buf, nbytes);
   }
  -
  -/* the timeout code is a separate routine because it requires
  -    a stack frame... and we don't want to pay that setup cost
  -    on every call */
  -
  -/* this macro expands into the four basic i/o methods */
  -
  -#define method(name, args, syscall, selread, selwrite)       \
  -    static ap_status_t beos_##name##_timeout args \
  -    { \
  -     iol_socket *iol = (iol_socket *)viol; \
  -     fd_set fdset; \
  -     struct timeval tv; \
  -     int rv; \
  - \
  -     FD_ZERO(&fdset); \
  -     FD_SET(iol->fd, &fdset); \
  -     tv.tv_sec = iol->timeout; \
  -     tv.tv_usec = 0; \
  -     do { \
  -         rv = select(iol->fd + 1, selread, selwrite, NULL, iol->timeout < 0 
? NULL : &tv); \
  -     } while (rv == -1 && errno == EINTR); \
  -     if (!FD_ISSET(iol->fd, &fdset)) { \
  -         return APR_ETIMEDOUT; \
  -     } \
  -     do { \
  -         rv = syscall(iol->fd, arg1, arg2, 0); \
  -     } while (rv == -1 && errno == EINTR); \
  -        if (rv >= 0) { \
  -            *nbytes = rv; \
  -            return APR_SUCCESS; \
  -        } \
  -     return errno; \
  -     \
  -    } \
  - \
  -    static ap_status_t beos_##name args \
  -    { \
  -     iol_socket *iol = (iol_socket *)viol; \
  -     int rv; \
  - \
  -        /* Present to zero until some bytes are actually written */ \
  -        *nbytes = 0; \
  -     if (!(iol->flags & FD_NONBLOCKING_SET)) { \
  -         if (iol->timeout < 0) { \
  -             rv = syscall(iol->fd, arg1, arg2, 0); \
  -                if (rv >= 0) { \
  -                    *nbytes = rv; \
  -                    return APR_SUCCESS; \
  -                } \
  -                return errno; \
  -         } \
  -         /* must shift descriptor to blocking mode now */ \
  -         if ((rv = set_nonblock(iol->fd)) != APR_SUCCESS) { \
  -             return rv; \
  -         } \
  -         iol->flags |= FD_NONBLOCKING_SET; \
  -     } \
  - \
  -     /* try writing, ignoring EINTR, the upper layer has to handle \
  -         partial read/writes anyhow, so we can return early */ \
  -     do { \
  -         rv = syscall(iol->fd, arg1, arg2, 0); \
  -     } while (rv == -1 && errno == EINTR); \
  -     if ((errno == EWOULDBLOCK || errno == EAGAIN) && iol->timeout != 0) { \
  -         return beos_##name##_timeout(viol, arg1, arg2, nbytes); \
  -     } \
  -     if (rv >= 0) { \
  -         *nbytes = rv; \
  -            return APR_SUCCESS; \
  -     } \
  -     return errno; \
  -    }
   
  -method(write, (ap_iol *viol, const char *arg1, ap_size_t arg2, ap_ssize_t 
*nbytes), send, NULL, &fdset)
  -method(read, (ap_iol *viol, char *arg1, ap_size_t arg2, ap_ssize_t *nbytes), 
recv, &fdset, NULL)
  +ap_status_t beos_writev(ap_iol *viol, const struct iovec *vec, int nvec,
  +    ap_ssize_t *nbytes)
  +{
  +    return ap_send(((iol_socket *)viol)->sock, vec[0].iov_base, 
vec[0].iov_len);
  +}
   
  -static ap_status_t beos_writev(ap_iol *viol, const struct iovec *vec, int 
arg2, ap_ssize_t *nbytes)
  +ap_status_t beos_read(ap_iol *viol, char* buf, ap_size_t size,
  +     ap_ssize_t *nbytes)
   {
  -    return beos_write(viol, vec[0].iov_base, vec[0].iov_len, nbytes);
  +    *nbytes = size;
  +    return ap_recv(((iol_socket *)viol)->sock, buf, nbytes);
   }
   
   static ap_status_t beos_close(ap_iol *viol)
   {
       iol_socket *iol = (iol_socket *)viol;
  -    int rv;
       int saved_errno;
   
  -    rv = closesocket(iol->fd);
  -    saved_errno = errno;
  +    saved_errno = ap_close_socket(iol->sock);
       free(iol);
  -    if (rv == 0) {
  +    if (saved_errno == 0) {
           return APR_SUCCESS;
       }
       return saved_errno;
  @@ -218,18 +140,12 @@
       beos_getopt
   };
   
  -ap_iol *beos_attach_socket(int fd)
  +ap_iol *beos_attach_socket(ap_socket_t *sock)
   {
       iol_socket *iol;
   
  -    if (fd >= FD_SETSIZE) {
  -     errno = EBADF;
  -     return NULL;
  -    }
       iol = malloc(sizeof(iol_socket));
       iol->iol.methods = &socket_methods;
  -    iol->fd = fd;
  -    iol->timeout = -1;
  -    iol->flags = 0;
  +    iol->sock = sock;
       return (ap_iol *)iol;
   }
  
  
  
  1.2       +1 -1      apache-2.0/src/os/beos/iol_socket.h
  
  Index: iol_socket.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/os/beos/iol_socket.h,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- iol_socket.h      1999/07/12 22:51:14     1.1
  +++ iol_socket.h      1999/11/02 12:26:43     1.2
  @@ -58,6 +58,6 @@
   #ifndef OS_UNIX_IOL_SOCKET_H
   #define OS_UNIX_IOL_SOCKET_H
   
  -ap_iol *beos_attach_socket(int fd);
  +ap_iol *beos_attach_socket(ap_socket_t *_sock);
   
   #endif
  
  
  

Reply via email to