ben         99/10/10 10:08:10

  Modified:    src      Configure
               src/lib/apr configure.in
               src/lib/apr/include apr_network_io.h
               src/lib/apr/network_io/unix networkio.h poll.c sockets.c
               src/modules/mpm/mpmt_pthread acceptlock.c acceptlock.h
                        mpmt_pthread.c
  Log:
  Attempt to port mpmt_pthreads to APR, but threads seem to be broken on my 
plaform
  so it is only partially tested.
  
  Revision  Changes    Path
  1.11      +10 -3     apache-2.0/src/Configure
  
  Index: Configure
  ===================================================================
  RCS file: /export/home/cvs/apache-2.0/src/Configure,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- Configure 1999/10/10 12:17:42     1.10
  +++ Configure 1999/10/10 17:07:53     1.11
  @@ -1724,15 +1724,24 @@
   ####################################################################
   ## Add in the APR library.
   ##
  +TEXTRA_CFLAGS=`egrep '^EXTRA_CFLAGS=' Makefile.config | tail -1 |\
  +            sed -e 's;^EXTRA_CFLAGS=;;' -e 's;\`.*\`;;'`
  +
   if [ -d ./lib/apr ]; then
       if helpers/PrintPath -s autoconf; then
           echo " + bootstrapping Apache Portable Runtime (APR)"
           (cd lib/apr && autoconf && autoheader)
       fi
       echo " + configuring Apache Portable Runtime (APR)"
  +    APR_FLAGS=`egrep ^APR_FLAGS= $file|sed -e 's/APR_FLAGS='//`
  +    if [ "x$APR_FLAGS" != "x" ]; then
  +     echo "    o with flags: $APR_FLAGS"
  +    fi
       cd lib/apr 
       stripped_CFLAGS=`echo "$CFLAGS " | sed -e 's/-DTARGET[^ ]*//'` # FIXME
  -    CC="$CC" CFLAGS="$TEXTRA_CFLAGS $stripped_CFLAGS" OPTIM="$TOPTIM $OPTIM" 
./configure >/dev/null
  +    # configure fails with -Werror, because it writes crap C for its tests...
  +    stripped_TEXTRA_CFLAGS=`echo "$TEXTRA_CFLAGS" | sed -e 's/-Werror//'`
  +    CC="$CC" CFLAGS="$stripped_TEXTRA_CFLAGS $stripped_CFLAGS" 
OPTIM="$TOPTIM $OPTIM" ./configure $APR_FLAGS > /dev/null
       if [ $? -ne 0 ]; then
           echo "** FAILED to configure APR"
           exit 1
  @@ -2161,8 +2170,6 @@
   ## ap_config_auto.h so they are available to external modules needing to
   ## include Apache header files.
   ##
  -TEXTRA_CFLAGS=`egrep '^EXTRA_CFLAGS=' Makefile.config | tail -1 |\
  -            sed -e 's;^EXTRA_CFLAGS=;;' -e 's;\`.*\`;;'`
   tmpstr=`echo $CFLAGS $TEXTRA_CFLAGS |\
        sed -e 's;[     ]\([+-]\);!\1;g' -e 's/\([^\\\]\)"/\1/g' -e 
's/\\\"/\"/g'`
   OIFS="$IFS"
  
  
  
  1.16      +3 -0      apache-2.0/src/lib/apr/configure.in
  
  Index: configure.in
  ===================================================================
  RCS file: /export/home/cvs/apache-2.0/src/lib/apr/configure.in,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- configure.in      1999/10/08 16:07:38     1.15
  +++ configure.in      1999/10/10 17:07:57     1.16
  @@ -28,6 +28,9 @@
   AC_CHECK_PROG(RM, rm, rm)
   AC_CHECK_PROG(AR, ar, ar)
   
  +AC_ARG_WITH(debug,[  --with-debug              Turn on debugging and compile 
time warnings],
  +     [if test "$GCC" = "yes"; then CFLAGS="$CFLAGS -g -Wall"; else 
CFLAGS="$CFLAGS -g"; fi])
  +
   dnl # this is the place to put specific options for platform/compiler
   dnl # combinations
   case "$OS:$CC" in
  
  
  
  1.9       +6 -3      apache-2.0/src/lib/apr/include/apr_network_io.h
  
  Index: apr_network_io.h
  ===================================================================
  RCS file: /export/home/cvs/apache-2.0/src/lib/apr/include/apr_network_io.h,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- apr_network_io.h  1999/10/04 16:36:54     1.8
  +++ apr_network_io.h  1999/10/10 17:07:59     1.9
  @@ -128,9 +128,12 @@
   ap_status_t ap_getport(ap_socket_t *, ap_uint32_t *);
   ap_status_t ap_getipaddr(char *buf, ap_ssize_t len, const ap_socket_t *sock);
   
  -ap_status_t ap_setup_poll(ap_pollfd_t **, ap_context_t *, ap_int32_t);
  -ap_status_t ap_poll(ap_pollfd_t *, ap_int32_t *, ap_int32_t);
  -ap_status_t ap_add_poll_socket(ap_pollfd_t *, ap_socket_t *, ap_int16_t);
  +ap_status_t ap_setup_poll(ap_pollfd_t **pollset, ap_context_t *ctx,
  +                       ap_int32_t nsocks);
  +ap_status_t ap_poll(struct pollfd_t *pollset, ap_int32_t *nsocks, 
  +                 ap_int32_t timeout);
  +ap_status_t ap_add_poll_socket(ap_pollfd_t *pollset, ap_socket_t *sock,
  +                            ap_int16_t events);
   ap_status_t ap_remove_poll_socket(ap_pollfd_t *, ap_socket_t *, ap_int16_t);
   ap_status_t ap_clear_poll_sockets(ap_pollfd_t *, ap_int16_t);
   ap_status_t ap_get_revents(ap_pollfd_t *, ap_socket_t *, ap_int16_t *);
  
  
  
  1.6       +3 -0      apache-2.0/src/lib/apr/network_io/unix/networkio.h
  
  Index: networkio.h
  ===================================================================
  RCS file: 
/export/home/cvs/apache-2.0/src/lib/apr/network_io/unix/networkio.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- networkio.h       1999/10/08 19:44:30     1.5
  +++ networkio.h       1999/10/10 17:08:00     1.6
  @@ -68,6 +68,9 @@
       struct sockaddr_in *addr;
       size_t addr_len;
       int timeout; 
  +#ifndef HAVE_POLL
  +    int connected;
  +#endif
   };
   
   struct pollfd_t {
  
  
  
  1.12      +8 -9      apache-2.0/src/lib/apr/network_io/unix/poll.c
  
  Index: poll.c
  ===================================================================
  RCS file: /export/home/cvs/apache-2.0/src/lib/apr/network_io/unix/poll.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- poll.c    1999/10/10 13:19:57     1.11
  +++ poll.c    1999/10/10 17:08:00     1.12
  @@ -349,8 +349,7 @@
   ap_status_t ap_get_revents(struct pollfd_t *aprset, struct socket_t *sock, 
ap_int16_t *event)
   {
       ap_int16_t revents = 0;
  -    char data[256];
  -    int dummy = 256;
  +    char data[1];
       int flags = MSG_PEEK;
   
       /* We just want to PEEK at the data, so I am setting up a dummy WSABUF
  @@ -358,24 +357,24 @@
        */
       if (FD_ISSET(sock->socketdes, aprset->read)) {
           revents |= APR_POLLIN;
  -        if (recv(sock->socketdes, &data, dummy, flags) == -1) {
  +        if (sock->connected
  +         && recv(sock->socketdes, data, sizeof data, flags) == -1) {
               switch (errno) {
                   case ECONNRESET:
                   case ECONNABORTED:
                   case ESHUTDOWN:
  -                case ENETRESET: {
  +                case ENETRESET:
                       revents ^= APR_POLLIN;
                       revents |= APR_POLLHUP;
                       break;
  -                }
  -                case ENOTSOCK: {
  +                case ENOTSOCK:
                       revents ^= APR_POLLIN;
                       revents |= APR_POLLNVAL;
  -                }
  -                default: {
  +                 break;
  +                default:
                       revents ^= APR_POLLIN;
                       revents |= APR_POLLERR;
  -                }
  +                 break;
               }
           }
       }
  
  
  
  1.14      +6 -0      apache-2.0/src/lib/apr/network_io/unix/sockets.c
  
  Index: sockets.c
  ===================================================================
  RCS file: /export/home/cvs/apache-2.0/src/lib/apr/network_io/unix/sockets.c,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- sockets.c 1999/10/08 20:04:18     1.13
  +++ sockets.c 1999/10/10 17:08:00     1.14
  @@ -258,6 +258,9 @@
       (*new)->addr = (struct sockaddr_in *)ap_palloc((*new)->cntxt, 
                    sizeof(struct sockaddr_in));
       (*new)->addr_len = sizeof(struct sockaddr_in);
  +#ifndef HAVE_POLL
  +    (*new)->connected = 1;
  +#endif
   
       (*new)->socketdes = accept(sock->socketdes, (struct sockaddr 
*)(*new)->addr,
                           &(*new)->addr_len);
  @@ -307,6 +310,9 @@
           return errno;
       }
       else {
  +#ifndef HAVE_POLL
  +     sock->connected=1;
  +#endif
           return APR_SUCCESS;
       }
   }
  
  
  
  1.12      +8 -7      apache-2.0/src/modules/mpm/mpmt_pthread/acceptlock.c
  
  Index: acceptlock.c
  ===================================================================
  RCS file: 
/export/home/cvs/apache-2.0/src/modules/mpm/mpmt_pthread/acceptlock.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- acceptlock.c      1999/10/06 23:04:12     1.11
  +++ acceptlock.c      1999/10/10 17:08:06     1.12
  @@ -257,7 +257,7 @@
   #endif
   }
   
  -void accept_mutex_cleanup(void *foo)
  +ap_status_t accept_mutex_cleanup(void *foo)
   {
       int i;
      
  @@ -394,7 +394,7 @@
    * means we have to be sure to clean this up or else we'll leak
    * semaphores.
    */
  -void accept_mutex_cleanup(void *foo)
  +ap_status_t accept_mutex_cleanup(void *foo)
   {
       union semun ick;
       int i;
  @@ -555,7 +555,7 @@
   
   static int *lock_fd = NULL;
   
  -void accept_mutex_cleanup(void *foo)
  +ap_status_t accept_mutex_cleanup(void *foo)
   {
       int i;
     
  @@ -564,6 +564,7 @@
           lock_fname = expand_lock_fname(foo, i);
           unlink(lock_fname);
       }
  +    return APR_SUCCESS;
   }
   
   /*
  @@ -605,8 +606,8 @@
       for (i = 0; i < lock_count; i++) {
           lock_fname = expand_lock_fname(p, i);
           unlink(lock_fname);
  -        ap_open(p, lock_fname, APR_CREATE | APR_WRITE | APR_EXCL,
  -                APR_UREAD | APR_UWRITE, &tempfile);
  +        ap_open(&tempfile, p, lock_fname, APR_CREATE | APR_WRITE | APR_EXCL,
  +                APR_UREAD | APR_UWRITE);
           ap_get_os_file(&lock_fd[i], tempfile);
           if (lock_fd[i] == -1) {
            ap_log_error(APLOG_MARK, APLOG_EMERG, 
  @@ -647,7 +648,7 @@
   
   static HMTX *lock_sem = NULL;
   
  -void accept_mutex_cleanup(void *foo)
  +ap_status_t accept_mutex_cleanup(void *foo)
   { 
       int i;
     
  @@ -726,7 +727,7 @@
   
   static int tpf_core_held;
   
  -static void accept_mutex_cleanup(void *foo)
  +static ap_status_t accept_mutex_cleanup(void *foo)
   {
       if(tpf_core_held)
           coruc(RESOURCE_KEY);
  
  
  
  1.5       +4 -4      apache-2.0/src/modules/mpm/mpmt_pthread/acceptlock.h
  
  Index: acceptlock.h
  ===================================================================
  RCS file: 
/export/home/cvs/apache-2.0/src/modules/mpm/mpmt_pthread/acceptlock.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- acceptlock.h      1999/08/31 05:33:22     1.4
  +++ acceptlock.h      1999/10/10 17:08:07     1.5
  @@ -82,13 +82,13 @@
   #elif defined (USE_PTHREAD_SERIALIZED_ACCEPT)
   void accept_mutex_child_cleanup(void *);
   void accept_mutex_child_init(ap_context_t *);
  -void accept_mutex_cleanup(void *);
  +ap_status_t accept_mutex_cleanup(void *);
   void accept_mutex_init(ap_context_t *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined (USE_SYSVSEM_SERIALIZED_ACCEPT)
  -void accept_mutex_cleanup(void *);
  +ap_status_t accept_mutex_cleanup(void *);
   #define accept_mutex_child_init(x)
   void accept_mutex_init(ap_context_t *, int);
   void accept_mutex_on(int);
  @@ -101,14 +101,14 @@
   void accept_mutex_off(int);
   
   #elif defined(USE_FLOCK_SERIALIZED_ACCEPT)
  -void accept_mutex_cleanup(void *);
  +ap_status_t accept_mutex_cleanup(void *);
   void accept_mutex_child_init(ap_context_t *);
   void accept_mutex_init(ap_context_t *, int);
   void accept_mutex_on(int);
   void accept_mutex_off(int);
   
   #elif defined(USE_OS2SEM_SERIALIZED_ACCEPT)
  -void accept_mutex_cleanup(void *);
  +ap_status_t accept_mutex_cleanup(void *);
   void accept_mutex_child_init(ap_context_t *);
   void accept_mutex_init(ap_context_t *, int);
   void accept_mutex_on(int);
  
  
  
  1.36      +32 -25    apache-2.0/src/modules/mpm/mpmt_pthread/mpmt_pthread.c
  
  Index: mpmt_pthread.c
  ===================================================================
  RCS file: 
/export/home/cvs/apache-2.0/src/modules/mpm/mpmt_pthread/mpmt_pthread.c,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- mpmt_pthread.c    1999/10/07 20:48:13     1.35
  +++ mpmt_pthread.c    1999/10/10 17:08:07     1.36
  @@ -71,7 +71,6 @@
   #include "scoreboard.h" 
   #include "acceptlock.h"
   
  -#include <poll.h>
   #include <netinet/tcp.h> 
   #include <pthread.h>
   
  @@ -91,8 +90,8 @@
   API_VAR_EXPORT int ap_extended_status = 0;
   static int workers_may_exit = 0;
   static int requests_this_child;
  -static int num_listenfds = 0;
  -static struct pollfd *listenfds;
  +static int num_listensocks = 0;
  +static ap_socket_t **listensocks;
   
   /* The structure used to pass unique initialization info to each thread */
   typedef struct {
  @@ -776,11 +775,12 @@
   {
       pthread_mutex_lock(&pipe_of_death_mutex);
       if (!workers_may_exit) {
  -        int ret;
  +        ap_status_t ret;
           char pipe_read_char;
  +     int n=1;
   
  -        ret = read(listenfds[0].fd, &pipe_read_char, 1);
  -        if (ret == -1 && errno == EAGAIN) {
  +        ret = ap_recv(listensocks[0], &pipe_read_char, &n);
  +        if (ret == APR_EAGAIN) {
               /* It lost the lottery. It must continue to suffer
                * through a life of servitude. */
           }
  @@ -803,9 +803,10 @@
       ap_socket_t *csd = NULL;
       ap_context_t *ptrans;            /* Pool for per-transaction stuff */
       ap_socket_t *sd = NULL;
  -    int srv;
  +    int n;
       int curr_pollfd, last_pollfd = 0;
       int thesock;
  +    ap_pollfd_t *pollset;
   
       free(ti);
   
  @@ -815,6 +816,10 @@
       worker_thread_count++;
       pthread_mutex_unlock(&worker_thread_count_mutex);
   
  +    ap_setup_poll(&pollset, tpool, num_listensocks+1);
  +    for(n=0 ; n <= num_listensocks ; ++n)
  +     ap_add_poll_socket(pollset, listensocks[n], APR_POLLIN);
  +
       /* TODO: Switch to a system where threads reuse the results from earlier
          poll calls - manoj */
       while (!workers_may_exit) {
  @@ -830,9 +835,12 @@
           }
           SAFE_ACCEPT(accept_mutex_on(0));
           while (!workers_may_exit) {
  -            srv = poll(listenfds, num_listenfds + 1, -1);
  -            if (srv < 0) {
  -                if (errno == EINTR) {
  +         ap_status_t ret;
  +         ap_int16_t event;
  +
  +            ret = ap_poll(pollset, &n, -1);
  +            if (ret != APR_SUCCESS) {
  +                if (ret == APR_EINTR) {
                       continue;
                   }
   
  @@ -845,14 +853,15 @@
   
               if (workers_may_exit) break;
   
  -            if (listenfds[0].revents & POLLIN) {
  +         ap_get_revents(pollset, listensocks[0], &event);
  +            if (event & APR_POLLIN) {
                   /* A process got a signal on the shutdown pipe. Check if 
we're
                    * the lucky process to die. */
                   check_pipe_of_death();
                   continue;
               }
   
  -            if (num_listenfds == 1) {
  +            if (num_listensocks == 1) {
                   sd = ap_listeners->sd;
                   goto got_fd;
               }
  @@ -861,13 +870,14 @@
                   curr_pollfd = last_pollfd;
                   do {
                       curr_pollfd++;
  -                    if (curr_pollfd > num_listenfds) {
  +                    if (curr_pollfd > num_listensocks) {
                           curr_pollfd = 1;
                       }
                       /* XXX: Should we check for POLLERR? */
  -                    if (listenfds[curr_pollfd].revents & POLLIN) {
  +                 ap_get_revents(pollset, listensocks[curr_pollfd], &event);
  +                    if (event & APR_POLLIN) {
                           last_pollfd = curr_pollfd;
  -                        ap_put_os_sock(&sd, &listenfds[curr_pollfd].fd, 
tpool); 
  +                     sd=listensocks[curr_pollfd];
                           goto got_fd;
                       }
                   } while (curr_pollfd != last_pollfd);
  @@ -944,15 +954,12 @@
       requests_this_child = ap_max_requests_per_child;
       
       /* Set up the pollfd array */
  -    listenfds = ap_palloc(pchild, sizeof(struct pollfd) * (num_listenfds + 
1));
  -    listenfds[0].fd = pipe_of_death[0];
  -    listenfds[0].events = POLLIN;
  -    listenfds[0].revents = 0;
  -    for (lr = ap_listeners, i = 1; i <= num_listenfds; lr = lr->next, ++i) {
  -        ap_get_os_sock(lr->sd, &listenfds[i].fd);
  -        listenfds[i].events = POLLIN; /* should we add POLLPRI ?*/
  -        listenfds[i].revents = 0;
  -    }
  +    listensocks = ap_palloc(pchild,
  +                         sizeof(*listensocks) * (num_listensocks + 1));
  +    ap_create_tcp_socket(&listensocks[0], pchild);
  +    ap_put_os_sock(&listensocks[0], &pipe_of_death[0], pchild);
  +    for (lr = ap_listeners, i = 1; i <= num_listensocks; lr = lr->next, ++i)
  +     listensocks[i]=lr->sd;
   
       /* Setup worker threads */
   
  @@ -1303,7 +1310,7 @@
           exit(1);
       }
       server_conf = s;
  -    if ((num_listenfds = setup_listeners(server_conf)) < 1) {
  +    if ((num_listensocks = setup_listeners(server_conf)) < 1) {
           /* XXX: hey, what's the right way for the mpm to indicate a fatal 
error? */
           ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ALERT, s,
               "no listening sockets available, shutting down");
  
  
  

Reply via email to