You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Jeff Trawick <tr...@attglobal.net> on 2001/10/11 22:17:41 UTC
Re: cvs commit: httpd-2.0/server/mpm/prefork prefork.c
gregames@apache.org writes:
> gregames 01/10/11 09:28:23
>
> Modified: server/mpm/prefork prefork.c
> Log:
> fix another seg fault.
> @@ -663,12 +663,14 @@
> }
> first_lr=lr;
> do {
> - apr_os_sock_get(&sockdes, lr->sd);
> - if (FD_ISSET(sockdes, &main_fds))
> - goto got_listener;
> - lr = lr->next;
> - if (!lr)
> - lr = ap_listeners;
> + if (lr->active) {
> + apr_os_sock_get(&sockdes, lr->sd);
> + if (FD_ISSET(sockdes, &main_fds))
> + goto got_listener;
> + lr = lr->next;
> + if (!lr)
> + lr = ap_listeners;
> + }
I think that what needs to happen is to get inactive records out of
the ap_listeners list.
We still have some ugliness and inefficiencies in the other MPMs
caused by exposing inactive ap_listen_recs to the MPMs. Maybe we
don't care as long as it doesn't segfault.
The only reason I can think of that we keep the inactive records
around is to re-use the storage on the next restart in case that
listener can be initialized. The storage is from a pool that is never
released, so we have to be careful that we don't leak every time we
restart.
It would be fairly simple to malloc()/free() the ap_listen_rec in
order to avoid the bogosity we force on the MPM. However, this may
not be the complete issue because this might allow leakage of an
apr_sockaddr_t.
So even though I've looked at it, I don't have a clear picture of what
has to be done to get the code as simple as possible yet avoid a leak
on restart.
Now maybe we don't care if we leak when one of the listeners doesn't
initialize. That opens up a certain simplification.
Another alternative is that we keep the inactive ones in a different
list. We can still re-use the ap_listen_rec and apr_sockaddr_t* when
we restart and try again to set up the socket, but because it is in a
different list we don't have to worry the MPM about such details.
*I'm not sure we re-use this currently. That needs to be looked at.
--
Jeff Trawick | trawick@attglobal.net | PGP public key at web site:
http://www.geocities.com/SiliconValley/Park/9289/
Born in Roswell... married an alien...
Re: cvs commit: httpd-2.0/server/mpm/prefork prefork.c
Posted by Greg Ames <gr...@remulak.net>.
Jeff Trawick wrote:
>
> gregames@apache.org writes:
>
> > gregames 01/10/11 09:28:23
> >
> > Modified: server/mpm/prefork prefork.c
> > Log:
> > fix another seg fault.
> > @@ -663,12 +663,14 @@
> > }
> > first_lr=lr;
> > do {
> > - apr_os_sock_get(&sockdes, lr->sd);
> > - if (FD_ISSET(sockdes, &main_fds))
> > - goto got_listener;
> > - lr = lr->next;
> > - if (!lr)
> > - lr = ap_listeners;
> > + if (lr->active) {
> > + apr_os_sock_get(&sockdes, lr->sd);
> > + if (FD_ISSET(sockdes, &main_fds))
> > + goto got_listener;
> > + lr = lr->next;
> > + if (!lr)
> > + lr = ap_listeners;
> > + }
>
> I think that what needs to happen is to get inactive records out of
> the ap_listeners list.
For sure. I was thinking the same when I hit this seg fault, but took
the easy way out so I could move on to other bugs.
Greg