Re: wait-for-child-process broken for long running child processes

Roderic Morris <[email protected]> Tue, 3 May 2011 17:13:36 -0400
Newsgroups gmane.lisp.scheme.scheme48
Message-ID <[email protected]>
Any hope of these fixes being pushed?

-Roderic

On Mon, Apr 18, 2011 at 6:58 PM, Roderic Morris <[email protected]> wrote:
> I've come across a bug in wait-for-child-process in the
> posix-processes package. If the process with the given pid hasn't died
> and is long running, wait-for-child-process will start to allocate a
> ridiculous amount of memory. I've had it make pretty powerful machines
> unusable.
>
> I looked into it and traced the problem to the C function
> posix_waitpid() in c/posix/proc.c. It fails to handle the case where
> waitpid() returns 0 (which means that there are children running, but
> no statuses are available for them). In the best case, this causes it
> to loop until the child process dies, pegging the cpu. Unfortunately,
> there's a space leak somewhere inside the loop, so the problem is even
> worse and manifests itself in the way i described.
>
> One of the patches I've attached fixes that problem (although it
> doesn't address the space leak), but uncovers a few others. First,
> process-terminated-children is actually broken in the case where it's
> not given an argument, but it finds a process which is being waited
> on. Second, wait-for-child-process will never return in the long
> running child case, unless some other code has called
> make-signal-queue with sigchld as an argument. os-signal-handler isn't
> called for sigchld unless that happens. I've attached another patch
> for the first, but I'm not sure how to approach the second.
>
> P.S. Is there a way to disable deadlock detection other than the
> (spawn (lambda ()
>           ; Sleep for a year
>           (sleep (* 1000 60 60 24 365))))
> hack from the manual? I've never had it be helpful, and it's
> especially annoying when doing any work with subprocesses.
>
> -Roderic
>