[please CC me on replies]
On Tue, May 30, 2006 at 12:13:09PM +1000, Bojan Smojver wrote:
> I'm seeing an endless loop in this part of the code:
>
> ------------------------------------------------
> do {
> apr_bucket *f = APR_BRIGADE_FIRST(in);
> APR_BUCKET_REMOVE(f);
> APR_BRIGADE_INSERT_TAIL(out, f);
> } while (e != APR_BRIGADE_FIRST(in));
> ------------------------------------------------
A loop like this will not terminate if "e" points to the brigade
sentinel on entry; not sure if this is possible in the context of this
code, but it's easy enough to verify with an assertion.
If all you want to do is move a section of buckets onto another brigade
you can actually do it in a constant time operation, i.e. without having
to iterate through all the buckets. To splice buckets from "a" to "b"
inclusively onto brigade "output", do:
APR_RING_UNSPLICE(a, b, link);
APR_RING_SPLICE_TAIL(&output->list, a, b, apr_bucket, link);
and APR_RING_SPLICE_HEAD can be used similarly. It's a good idea to use
the _CHECK_CONSISTENCY macros after using any APR_RING_* macros directly
so that debug builds run the sanity checks.
Regards,
joe