Hi all:
I've posted a few messages regarding this topic. I believe that there
must be someone interested in this topic who wrote the apr_pools.c
originally or has worked with apr_pool_note_subprocess(). If not, then I
suppose that would explain the lack of interest in this problem.
To summarize, I believe that there is a bug either in apr_pools.c (in the
function free_proc_chain()) or in apr_proc_wait(). I posted a patch to
this list with a fix that does work. I didn't begin to dive into
apr_proc_wait() (which may be the true source of the problem) until I got
some feedback from the developers on this list.
Any response would be greatly appreciated.
Regards,
Erik.
On Sat, 24 Nov 2007, Erik Lotspeich wrote:
Hi:
I continued my investigation as to the reason why apr_pool_note_subprocess()
is not working for me. It seems that there is a bug in apr_pools.c in the
function free_proc_chain(). Here's my patch:
--- apr_pools.c 2007-11-24 23:06:12.000000000 -0800
+++ apr_pools.c+ 2007-11-24 23:06:01.000000000 -0800
@@ -2118,7 +2118,7 @@
#ifndef NEED_WAITPID
/* Pick up all defunct processes */
for (pc = procs; pc; pc = pc->next) {
- if (apr_proc_wait(pc->proc, NULL, NULL, APR_NOWAIT) !=
APR_CHILD_NOTDONE)
+ if (apr_proc_wait(pc->proc, NULL, NULL, APR_NOWAIT) ==
APR_CHILD_DONE)
pc->kill_how = APR_KILL_NEVER;
}
#endif /* !defined(NEED_WAITPID) */
It may be true that apr_proc_wait is the original source of the problem. In
theory, both the previous and patched versions of the code above are
equivalent. In reality, the doxygen documentation is incomplete.
apr_proc_wait can return codes other than APR_CHILD_DONE and
APR_CHILD_NOTDONE. In my case, the process I to be checked was actually
running, but an APR_CHILD_NOTDONE code wasn't being set!
Any questions or comments would be appreciated.
Regards,
Erik.