Joe Schaefer wrote:
Stas Bekman <[EMAIL PROTECTED]> writes:

[...]


Joe, there is a test where setaside is needed for real. It's:

t/filter/TestFilter/in_bbs_inject_header.pm:             # it can be stashed
away (missing $b->setaside wrapper):

            # XXX: this is broken: the bucket must be set-aside before
            # it can be stashed away (missing $b->setaside wrapper)
            push @{ $ctx->{buckets} }, $b;
            debug "queued header [$data]";
            inject_header_bucket($bb, $ctx);
            next; # inject_header_bucket already called insert_tail
            # notice that if we didn't inject any headers, this will
            # still work ok, as inject_header_bucket will send the
            # separator header which we just pushed to its queue

If you can deploy it there, that would be great.


No problem.  Is this what you have in mind?

Index: t/filter/TestFilter/in_bbs_inject_header.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_inject_header.pm,v
retrieving revision 1.12
diff -u -r1.12 in_bbs_inject_header.pm
--- t/filter/TestFilter/in_bbs_inject_header.pm 4 Oct 2004 02:16:42 -0000      1.12
+++ t/filter/TestFilter/in_bbs_inject_header.pm 4 Oct 2004 03:30:12 -0000
@@ -179,7 +179,9 @@
         if ($data and $data =~ /^POST/) {
             # demonstrate how to add a header while processing other headers
             my $header = "$header1_key: $header1_val\n";
-            push @{ $ctx->{buckets} }, APR::Bucket->new($c->bucket_alloc, $header);
+            my $bucket = APR::Bucket->new($c->bucket_alloc, $header);
+            $bucket->setaside($c->pool);
+            push @{ $ctx->{buckets} }, $bucket;
             debug "queued header [$header]";
         }
         elsif ($data =~ /^[\r\n]+$/) {
@@ -197,7 +199,9 @@
             # time to add extra headers:
             for my $key (keys %headers) {
                 my $header = "$key: $headers{$key}\n";
-                push @{ $ctx->{buckets} }, APR::Bucket->new($c->bucket_alloc, 
$header);
+                my $bucket =  APR::Bucket->new($c->bucket_alloc, $header);
+                $bucket->setaside($c->pool);
+                push @{ $ctx->{buckets} }, $bucket;
                 debug "queued header [$header]";
             }

@@ -205,8 +209,8 @@
             # the separator header will be sent as a last header
             # so we send one newly added header and push the separator
             # to the end of the queue
-            # XXX: this is broken: the bucket must be set-aside before
-            # it can be stashed away (missing $b->setaside wrapper)
+
+            $b->setaside($c->pool);
             push @{ $ctx->{buckets} }, $b;
             debug "queued header [$data]";
             inject_header_bucket($bb, $ctx);

I think so. It was obviously wrong before, isn't it?

One criticism I have about this test- it is technically
incorrect to store the setaside buckets in a Perl array
instead of keeping them in a bucket brigade. That's because any buckets left-over in the array will not get destroyed,
which can cause a memory leak. It is always good practice to always keep buckets in brigades, because the brigade's cleanup should take care of this (which is the reason why calling destroy() on a brigade is inferior to calling cleanup()).

An excellent point, Joe. So should we just change the AV for bb and store that in the context?


In the real module (http://search.cpan.org/dist/Apache-Filter-HTTPHeadersFixup/) I don't use bucket brigades to do the storage, but only strings. But I've left this test to use buckets so we have more tests (which needs to be polished).


-- __________________________________________________________________ Stas Bekman JAm_pH ------> Just Another mod_perl Hacker http://stason.org/ mod_perl Guide ---> http://perl.apache.org mailto:[EMAIL PROTECTED] http://use.perl.org http://apacheweek.com http://modperlbook.org http://apache.org http://ticketmaster.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to