joes 2004/10/03 19:15:49
Modified: src/docs/2.0/api/APR Brigade.pod Bucket.pod
src/docs/2.0/api/Apache RequestRec.pod
src/docs/2.0/user/handlers filters.pod protocols.pod
Log:
Reimplement APR::Bucket using apr_bucket_alloc_t -
* $bucket_alloc argument added to APR::Bucket::new
* new subs:
APR::Bucket::setaside
APR::Bucket::alloc_create
APR::Bucket::alloc_destroy
APR::Brigade::bucket_alloc
* new setaside implementation, using pool buckets
instead of heap buckets for better performance
and leak safety.
Reviewed by: stas
Revision Changes Path
1.11 +28 -3 modperl-docs/src/docs/2.0/api/APR/Brigade.pod
Index: Brigade.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/APR/Brigade.pod,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Brigade.pod 12 Jul 2004 23:13:22 -0000 1.10
+++ Brigade.pod 4 Oct 2004 02:15:49 -0000 1.11
@@ -389,6 +389,31 @@
+=head2 C<bucket_alloc>
+
+ my $ba = $bb->bucket_alloc();
+ $bb2->bucket_alloc($ba);
+
+=over 4
+
+=item obj: C<$bb>
+( C<L<APR::Brigade object or class|docs::2.0::api::APR::Brigade>> )
+
+
+=item opt arg1: C<$bucket_alloc>
+( C<L<APR::BucketAlloc object|docs::2.0::api::APR::BucketAlloc>> )
+
+Get/set the bucket allocator associated with this brigade.
+
+=item since: 1.99_17
+
+=back
+
+
+
+
+
+
=head2 C<next>
Return the next bucket in a brigade
@@ -525,9 +550,9 @@
brigade such that the second brigade will have the last two buckets.
my $bb1 = APR::Brigade->new($r->pool, $c->bucket_alloc);
- $bb1->insert_tail(APR::Bucket->new("1"));
- $bb1->insert_tail(APR::Bucket->new("2"));
- $bb1->insert_tail(APR::Bucket->new("3"));
+ $bb1->insert_tail(APR::Bucket->new($c->bucket_alloc, "1"));
+ $bb1->insert_tail(APR::Bucket->new($c->bucket_alloc, "2"));
+ $bb1->insert_tail(APR::Bucket->new($c->bucket_alloc, "3"));
C<$bb1> now contains buckets "1", "2", "3". Now do the split at the
second bucket:
1.14 +114 -17 modperl-docs/src/docs/2.0/api/APR/Bucket.pod
Index: Bucket.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/APR/Bucket.pod,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Bucket.pod 21 Aug 2004 00:48:47 -0000 1.13
+++ Bucket.pod 4 Oct 2004 02:15:49 -0000 1.14
@@ -10,7 +10,7 @@
use APR::Bucket ();
my $ba = $c->bucket_alloc;
- $b1 = APR::Bucket->new("aaa");
+ $b1 = APR::Bucket->new($ba, "aaa");
$b2 = APR::Bucket::eos_create($ba);
$b3 = APR::Bucket::flush_create($ba);
@@ -44,8 +44,8 @@
to visualize the operations:
my $bb = APR::Brigade->new($r->pool, $ba);
- my $d1 = APR::Bucket->new("d1");
- my $d2 = APR::Bucket->new("d2");
+ my $d1 = APR::Bucket->new($ba, "d1");
+ my $d2 = APR::Bucket->new($ba, "d2");
my $f1 = APR::Bucket::flush_create($ba);
my $f2 = APR::Bucket::flush_create($ba);
my $e1 = APR::Bucket::eos_create($ba);
@@ -105,7 +105,7 @@
for (my $b = $bb->first; $b; $b = $bb->next($b)) {
if ($b->read(my $data)) {
- my $nb = APR::Bucket->new(uc $data);
+ my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data);
$b->insert_before($nb);
$b->delete;
$b = $nb;
@@ -152,6 +152,70 @@
+=head2 C<alloc_create>
+
+Create an C<APR::BucketAlloc> freelist.
+
+ $ba = APR::Bucket::alloc_create($pool);
+
+=over 4
+
+=item arg1: C<$pool>
+( C<L<APR::Pool object|docs::2.0::api::APR::Pool>> )
+
+The pool used to create this this freelist.
+
+=item ret: C<$ba>
+( C<L<APR::BucketAlloc object|docs::2.0::api::APR::BucketAlloc>> )
+
+The new freelist.
+
+=item since: 1.99_17
+
+=back
+
+These freelists are used to create new buckets and bucket
+brigades. Normally it is not necesssary to create them,
+since the existing bucket brigades and/or connection objects
+in modperl-2 provide them automatically.
+
+Example:
+
+ use APR::Bucket ();
+ use Apache::Connection ();
+ my $ba = APR::Bucket::alloc_create($c->$pool);
+ my $eos_b = APR::Bucket::eos_create($ba);
+
+
+
+
+
+=head2 C<alloc_destroy>
+
+Destroy an C<APR::BucketAlloc> freelist.
+
+ APR::Bucket::alloc_destroy($ba);
+
+=over 4
+
+=item arg1: C<$ba>
+( C<L<APR::BucketAlloc object|docs::2.0::api::APR::BucketAlloc>> )
+
+The freelist to destroy.
+
+=item since: 1.99_17
+
+=back
+
+Destroys the freelist; this object may not be used again.
+Normally it is not necessary to destroy allocators, since
+the pool which created them will destroy them during pool
+cleanup.
+
+
+
+
+
=head2 C<eos_create>
Create an I<EndOfStream> bucket.
@@ -351,17 +415,20 @@
Create a new bucket and initialize it with data:
- $nb = APR::Bucket->new($data);
- $nb = $b->new($data);
- $nb = APR::Bucket->new($data, $offset);
- $nb = APR::Bucket->new($data, $offset, $len);
+ $nb = APR::Bucket->new($bucket_alloc, $data);
+ $nb = $b->new($bucket_alloc, $data);
+ $nb = APR::Bucket->new($bucket_alloc, $data, $offset);
+ $nb = APR::Bucket->new($bucket_alloc, $data, $offset, $len);
=over 4
=item obj: C<$b>
( C<L<APR::Bucket object or class|docs::2.0::api::APR::Bucket>> )
-=item arg1: C<$data> ( string )
+=item arg1: C<$bucket_alloc>
+( C<L<APR::BucketAlloc object|docs::2.0::api::APR::BucketAlloc>> )
+
+=item arg2: C<$data> ( string )
The data to initialize with.
@@ -370,11 +437,11 @@
after passing it to C<new()> you will modify the data in the bucket as
well. To avoid that pass to C<new()> a copy which you won't modify.
-=item opt arg2: C<$offset> ( number )
+=item opt arg3: C<$offset> ( number )
Optional offset inside C<$data>. Default: 0.
-=item opt arg3: C<$len> ( number )
+=item opt arg4: C<$len> ( number )
Optional partial length to read.
@@ -391,7 +458,7 @@
a newly created bucket object
-=item since: 1.99_10
+=item since: 1.99_17
=back
@@ -405,7 +472,7 @@
use APR::Bucket ();
my $data = "my data";
- my $b = APR::Bucket->new($data);
+ my $b = APR::Bucket->new($ba, $data);
now the bucket contains the string I<'my data'>.
@@ -416,7 +483,7 @@
use APR::Bucket ();
my $data = "my data";
my $offset = 3;
- my $b = APR::Bucket->new($data, $offset);
+ my $b = APR::Bucket->new($ba, $data, $offset);
now the bucket contains the string I<'data'>.
@@ -429,7 +496,7 @@
my $data = "my data";
my $offset = 3;
my $len = 3;
- my $b = APR::Bucket->new($data, $offset, $len);
+ my $b = APR::Bucket->new($ba, $data, $offset, $len);
now the bucket contains the string I<'dat'>.
@@ -443,7 +510,7 @@
Read the data from the bucket.
- $len = $b->read($buffer,);
+ $len = $b->read($buffer);
$len = $b->read($buffer, $block);
=over 4
@@ -546,6 +613,36 @@
+=head2 C<setaside>
+
+Ensure the bucket's data lasts at least as long as the given pool.
+
+
+ my $status = $bucket->setaside($pool);
+
+=over 4
+
+=item obj: C<$bucket>
+( C<L<APR::Bucket object|docs::2.0::api::APR::Bucket>> )
+
+=item arg1: C<$pool>
+( C<L<APR::Pool object|docs::2.0::api::APR::Pool>> )
+
+=item ret: status code- APR_SUCCESS or error condition.
+
+=item since: 1.99_17
+
+=back
+
+When the a modperl bucket is setaside, its data is detached from the
+original perl scalar and copied into a pool bucket. Usually setaside
+is called by certain output filters, in order to buffer socket writes
+of smaller buckets into a single write.
+
+
+
+
+
=head2 C<type>
Get the type of the data in the bucket.
@@ -621,7 +718,7 @@
It gives the offset to when a new bucket is created with a non-zero
offset value:
- my $b = APR::Bucket->new($data, $offset, $len);
+ my $b = APR::Bucket->new($ba, $data, $offset, $len);
So if the offset was 3. C<$start> will be 3 too.
1.33 +1 -1 modperl-docs/src/docs/2.0/api/Apache/RequestRec.pod
Index: RequestRec.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/Apache/RequestRec.pod,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- RequestRec.pod 21 Sep 2004 13:58:03 -0000 1.32
+++ RequestRec.pod 4 Oct 2004 02:15:49 -0000 1.33
@@ -1180,7 +1180,7 @@
my $bb = APR::Brigade->new($r->pool,
$r->connection->bucket_alloc);
- my $b = APR::Bucket->new($data);
+ my $b = APR::Bucket->new($bb->bucket_alloc, $data);
$bb->insert_tail($b);
$r->output_filters->fflush($bb);
$bb->destroy;
1.47 +5 -5 modperl-docs/src/docs/2.0/user/handlers/filters.pod
Index: filters.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/filters.pod,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- filters.pod 15 Aug 2004 07:54:00 -0000 1.46
+++ filters.pod 4 Oct 2004 02:15:49 -0000 1.47
@@ -1535,7 +1535,7 @@
warn("data: $data\n");
if ($data and $data =~ s|^GET|HEAD|) {
- my $nb = APR::Bucket->new($data);
+ my $nb = APR::Bucket->new($bb->bucket_alloc, $data);
$b->insert_after($nb);
$b->remove; # no longer needed
$f->ctx(1); # flag that that we have done the job
@@ -1769,7 +1769,7 @@
}
my $len = $b->read(my $data);
- $b = APR::Bucket->new(lc $data) if $len;
+ $b = APR::Bucket->new($bb->bucket_alloc, lc $data) if $len;
$b->remove;
$bb->insert_tail($b);
@@ -2120,7 +2120,7 @@
if ($b->read(my $data)) {
$data = join "",
map {scalar(reverse $_), "\n"} split "\n", $data;
- $b = APR::Bucket->new($data);
+ $b = APR::Bucket->new($bb->bucket_alloc, $data);
}
$b->remove;
@@ -2355,7 +2355,7 @@
# in ctx
for (split_buffer($buffer)) {
if (length($_) == TOKEN_SIZE) {
- $bb->insert_tail(APR::Bucket->new($_));
+ $bb->insert_tail(APR::Bucket->new($ba, $_));
}
else {
$ctx .= $_;
@@ -2365,7 +2365,7 @@
my $len = length($ctx);
if ($seen_eos) {
# flush the remainder
- $bb->insert_tail(APR::Bucket->new($ctx));
+ $bb->insert_tail(APR::Bucket->new($ba, $ctx));
$bb->insert_tail(APR::Bucket::eos_create($ba));
warn "seen eos, flushing the remaining: $len bytes\n";
}
1.29 +3 -3 modperl-docs/src/docs/2.0/user/handlers/protocols.pod
Index: protocols.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/protocols.pod,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- protocols.pod 15 Aug 2004 07:54:00 -0000 1.28
+++ protocols.pod 4 Oct 2004 02:15:49 -0000 1.29
@@ -366,7 +366,7 @@
if ($b->read(my $data)) {
$last++ if $data =~ /^[\r\n]+$/;
# could do some transformation on data here
- $b = APR::Bucket->new($data);
+ $b = APR::Bucket->new($bb->bucket_alloc, $data);
}
$b->remove;
@@ -469,7 +469,7 @@
if ($b->read(my $data)) {
last if $data =~ /^[\r\n]+$/;
- my $nb = APR::Bucket->new(uc $data);
+ my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data);
# head->...->$nb->$b ->...->tail
$b->insert_before($nb);
$b->remove;
@@ -575,7 +575,7 @@
last if $data =~ /^[\r\n]+$/;
# could transform data here
- my $b = APR::Bucket->new($data);
+ my $b = APR::Bucket->new($bb->bucket_alloc, $data);
$bb->insert_tail($b);
$c->output_filters->fflush($bb);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]