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");