Stas Bekman <[EMAIL PROTECTED]> writes:
> Joe Schaefer wrote:
> > Stas Bekman <[EMAIL PROTECTED]> writes:
> >
> >>Now going to try and reduce that sequence to a shorter one...
> > I don't think you need bother- the brigade loop is miscoded in compat.pm's
> > content sub- you can't ask for the next bucket *after* $b has been
> > removed.
>
> why not? it still points to the next bucket, no?
Probably so, because of the way (I think) APR_RING_UNSPLICE is
currently implemeted. But IMO that's not guaranteed by the
apr_ring.h documentation (unless that's what is meant by
"dangling pointers").
>
> > Instead of iterating using for(;;), use while():
> > while ($b = $bb->first) {
> > ++$seen_eos, last if $b->is_eos;
> > if ($b->read(my $buf)) {
> > $data .= $buf;
> > }
> > $b->delete; # APR::Bucket needs to wrap apr_bucket_delete(),
> > # since APR_BUCKET_REMOVE() doesn't actually
> > # decrement the bucket refcount
> > # so the bucket allocator can reclaim $b
> > }
>
> I've been explicitly rewriting the iteration loops recently not to use the
> while loop, because for anything more complicated it becomes a mess and too
> easy to put $b->delete in the wrong place.
OK, but don't call $b->remove, because its not doing anything
useful. Leave the buckets in the brigade and call $bb->cleanup
after each inner for() loop, that way the next call to get_brigade
will be able to reuse those buckets (if at all possible).
> I wonder why don't I see the problem right away then, and only after
> running a bunch of other tests. Any idea why?
No clue, yet.
--
Joe Schaefer
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]