From: Erik Faye-Lund Date: Tue, 11 Sep 2012 15:30:31 GMT Subject: Re: [PATCH] clear_child_for_cleanup must correctly manage children_to_clean Message-ID: In-Reply-To: <1347373967-29248-1-git-send-email-david@optimisefitness.com> On Tue, Sep 11, 2012 at 4:32 PM, David Gould wrote: > Iterate through children_to_clean using 'next' fields but with an > extra level of indirection. This allows us to update the chain when > we remove a child and saves us managing several variables around > the loop mechanism. > --- > run-command.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/run-command.c b/run-command.c > index f9922b9..c42d63b 100644 > --- a/run-command.c > +++ b/run-command.c > @@ -53,13 +53,13 @@ static void mark_child_for_cleanup(pid_t pid) > > static void clear_child_for_cleanup(pid_t pid) > { > - struct child_to_clean **last, *p; > + struct child_to_clean **pp; > > - last = &children_to_clean; > - for (p = children_to_clean; p; p = p->next) { > - if (p->pid == pid) { > - *last = p->next; > - free(p); > + for (pp = &children_to_clean; *pp; pp = &(*pp)->next) { > + if ((*pp)->pid == pid) { > + struct child_to_clean *clean_me = *pp; > + *pp = clean_me->next; > + free(clean_me); > return; > } > } > -- > 1.7.9.5 > Looks good to me. Thanks :)