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