It makes the socket read/write loops similar to filter ones:

    while ($socket->recv(my $buff, BUFF_LEN)) {
        $socket->send($buff);
    }

Here is the whole patch:

Index: lib/Apache/compat.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/compat.pm,v
retrieving revision 1.107
diff -u -r1.107 compat.pm
--- lib/Apache/compat.pm        4 Jun 2004 09:34:46 -0000       1.107
+++ lib/Apache/compat.pm        8 Jun 2004 15:59:21 -0000
@@ -501,8 +501,8 @@
                 last;
             }

-            my $buf = $b->read;
-            $data .= $buf if length $buf;
+            $b->read(my $buf);
+            $data .= $buf;
         }
     } while (!$seen_eos);

Index: t/conf/modperl_extra.pl
===================================================================
RCS file: /home/cvs/modperl-2.0/t/conf/modperl_extra.pl,v
retrieving revision 1.51
diff -u -r1.51 modperl_extra.pl
--- t/conf/modperl_extra.pl     4 Jun 2004 09:35:37 -0000       1.51
+++ t/conf/modperl_extra.pl     8 Jun 2004 15:59:21 -0000
@@ -164,9 +164,9 @@
                 last;
             }

-            my $buf = $b->read;
+            $b->read(my $buf);
             warn "read_post: DATA bucket: [$buf]\n" if $debug;
-            $data .= $buf if length $buf;
+            $data .= $buf;
         }

     } while (!$seen_eos);
@@ -273,7 +273,8 @@

     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
-        push @data, $b->type->name, $b->read;
+        $b->read(my $bdata);
+        push @data, $b->type->name, $bdata;
     }

     # send the sniffed info to STDERR so not to interfere with normal
Index: t/filter/TestFilter/in_bbs_body.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_body.pm,v
retrieving revision 1.5
diff -u -r1.5 in_bbs_body.pm
--- t/filter/TestFilter/in_bbs_body.pm  1 Jun 2004 23:36:16 -0000       1.5
+++ t/filter/TestFilter/in_bbs_body.pm  8 Jun 2004 15:59:21 -0000
@@ -34,7 +34,7 @@
             last;
         }

-        if (my $data = $bucket->read) {
+        if ($bucket->read(my $data)) {
             #warn"[$data]\n";
             $bucket = APR::Bucket->new(scalar reverse $data);
         }
Index: t/filter/TestFilter/in_bbs_consume.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_consume.pm,v
retrieving revision 1.4
diff -u -r1.4 in_bbs_consume.pm
--- t/filter/TestFilter/in_bbs_consume.pm       1 Jun 2004 23:36:16 -0000       1.4
+++ t/filter/TestFilter/in_bbs_consume.pm       8 Jun 2004 15:59:21 -0000
@@ -75,8 +75,7 @@
     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
         $seen_eos++, last if $b->is_eos;
-        my $bdata = $b->read;
-        $bdata = '' unless defined $bdata;
+        $b->read(my $bdata);
         push @data, $bdata;
     }
     return (join('', @data), $seen_eos);
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.8
diff -u -r1.8 in_bbs_inject_header.pm
--- t/filter/TestFilter/in_bbs_inject_header.pm 21 May 2004 22:01:16 -0000      1.8
+++ t/filter/TestFilter/in_bbs_inject_header.pm 8 Jun 2004 15:59:21 -0000
@@ -63,7 +63,7 @@

     if (1) {
         # extra debug, wasting cycles
-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "injected header: [$data]";
     }
     else {
@@ -166,7 +166,7 @@
             last;
         }

-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "filter read:\n[$data]";

         # check that we really work only on the headers
Index: t/filter/TestFilter/in_bbs_msg.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_msg.pm,v
retrieving revision 1.9
diff -u -r1.9 in_bbs_msg.pm
--- t/filter/TestFilter/in_bbs_msg.pm   1 Jun 2004 23:36:16 -0000       1.9
+++ t/filter/TestFilter/in_bbs_msg.pm   8 Jun 2004 15:59:21 -0000
@@ -38,7 +38,7 @@
             last;
         }

-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "FILTER READ:\n$data";

         if ($data and $data =~ s,GET $from_url,GET $to_url,) {
Index: t/filter/TestFilter/in_bbs_underrun.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_underrun.pm,v
retrieving revision 1.7
diff -u -r1.7 in_bbs_underrun.pm
--- t/filter/TestFilter/in_bbs_underrun.pm      1 Jun 2004 23:36:16 -0000       1.7
+++ t/filter/TestFilter/in_bbs_underrun.pm      8 Jun 2004 15:59:21 -0000
@@ -121,8 +121,7 @@
     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
         $seen_eos++, last if $b->is_eos;
-        my $bdata = $b->read;
-        $bdata = '' unless defined $bdata;
+        $b->read(my $bdata);
         push @data, $bdata;
     }
     return (join('', @data), $seen_eos);
Index: t/filter/TestFilter/out_bbs_basic.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_basic.pm,v
retrieving revision 1.4
diff -u -r1.4 out_bbs_basic.pm
--- t/filter/TestFilter/out_bbs_basic.pm        21 May 2004 18:40:50 -0000      1.4
+++ t/filter/TestFilter/out_bbs_basic.pm        8 Jun 2004 15:59:21 -0000
@@ -32,7 +32,7 @@
         for (my $bucket = $bb->first; $bucket; $bucket = $bb->next($bucket)) {
             ok $bucket->type->name;
             ok $bucket->length == 2;
-            my $data = $bucket->read;
+            $bucket->read(my $data);
             ok (defined $data and $data eq 'ok');
         }

Index: t/filter/TestFilter/out_bbs_ctx.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_ctx.pm,v
retrieving revision 1.5
diff -u -r1.5 out_bbs_ctx.pm
--- t/filter/TestFilter/out_bbs_ctx.pm  21 May 2004 18:40:50 -0000      1.5
+++ t/filter/TestFilter/out_bbs_ctx.pm  8 Jun 2004 15:59:22 -0000
@@ -43,8 +43,7 @@
             last;
         }

-        my $bdata = $bucket->read;
-        if (defined $bdata) {
+        if ($bucket->read(my $bdata)) {
             $data .= $bdata;
             my $len = length $data;

Index: t/protocol/TestProtocol/echo_bbs.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_bbs.pm,v
retrieving revision 1.1
diff -u -r1.1 echo_bbs.pm
--- t/protocol/TestProtocol/echo_bbs.pm 3 Jun 2004 08:20:50 -0000       1.1
+++ t/protocol/TestProtocol/echo_bbs.pm 8 Jun 2004 15:59:22 -0000
@@ -47,8 +47,7 @@
                 last;
             }

-            my $data = $bucket->read;
-            if (length $data) {
+            if ($bucket->read(my $data)) {
                 last if $data =~ /^[\r\n]+$/;
                 $bucket = APR::Bucket->new(uc $data);
             }
Index: t/protocol/TestProtocol/echo_block.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_block.pm,v
retrieving revision 1.5
diff -u -r1.5 echo_block.pm
--- t/protocol/TestProtocol/echo_block.pm       3 Jun 2004 08:22:21 -0000       1.5
+++ t/protocol/TestProtocol/echo_block.pm       8 Jun 2004 15:59:22 -0000
@@ -31,12 +31,8 @@
             or die "failed to set blocking mode";
     }

-    while (1) {
-        my $buff = $socket->recv(BUFF_LEN);
-        last unless length $buff; # EOF
-
-        my $wlen = $socket->send($buff);
-        last if $wlen != length $buff; # write failure?
+    while ($socket->recv(my $buff, BUFF_LEN)) {
+        $socket->send($buff);
     }

     Apache::OK;
Index: t/protocol/TestProtocol/echo_timeout.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_timeout.pm,v
retrieving revision 1.4
diff -u -r1.4 echo_timeout.pm
--- t/protocol/TestProtocol/echo_timeout.pm     3 Jun 2004 08:22:21 -0000       1.4
+++ t/protocol/TestProtocol/echo_timeout.pm     8 Jun 2004 15:59:22 -0000
@@ -29,20 +29,20 @@
     $socket->timeout_set(20_000_000);

     while (1) {
-        my $buff = eval { $socket->recv(BUFF_LEN) };
+        my $buff;
+        my $rlen = eval { $socket->recv($buff, BUFF_LEN) };
         if ($@) {
             die "timed out, giving up: $@" if $@ == APR::TIMEUP;
             die $@;
         }

-        last unless length $buff; # EOF
+        last unless $rlen; # EOF

         my $wlen = eval { $socket->send($buff) };
         if ($@) {
             die "timed out, giving up: $@" if $@ == APR::TIMEUP;
             die $@;
         }
-        last if $wlen != length $buff; # write failure?
     }

     Apache::OK;
Index: t/protocol/TestProtocol/eliza.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/eliza.pm,v
retrieving revision 1.6
diff -u -r1.6 eliza.pm
--- t/protocol/TestProtocol/eliza.pm    4 May 2004 06:14:44 -0000       1.6
+++ t/protocol/TestProtocol/eliza.pm    8 Jun 2004 15:59:22 -0000
@@ -19,10 +19,7 @@
     my APR::Socket $socket = $c->client_socket;

     my $last = 0;
-    while (1) {
-        my $buff = $socket->recv(BUFF_LEN);
-        last unless length $buff; # EOF
-
+    while ($socket->recv(my $buff, BUFF_LEN)) {
         # \r is sent instead of \n if the client is talking over telnet
         $buff =~ s/[\r\n]*$//;
         $last++ if $buff eq "Good bye, Eliza";
Index: t/response/TestAPR/bucket.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/bucket.pm,v
retrieving revision 1.3
diff -u -r1.3 bucket.pm
--- t/response/TestAPR/bucket.pm        4 Jun 2004 23:57:32 -0000       1.3
+++ t/response/TestAPR/bucket.pm        8 Jun 2004 15:59:22 -0000
@@ -20,7 +20,7 @@

     my $r = shift;

-    plan $r, tests => 26;
+    plan $r, tests => 29;

     my $ba = $r->connection->bucket_alloc;

@@ -47,8 +47,9 @@
         my $offset = 3;
         my $real = substr $data, $offset;
         my $b = APR::Bucket->new($data, $offset);
-        my $read = $b->read;
-        ok t_cmp($real, $read, 'new($data, $offset)');
+        my $rlen = $b->read(my $read);
+        ok t_cmp($real, $read, 'new($data, $offset)/buffer');
+        ok t_cmp(length($read), $rlen, 'new($data, $offset)/len');
         ok t_cmp($offset, $b->start, 'offset');

     }
@@ -60,8 +61,9 @@
         my $len    = 3;
         my $real = substr $data, $offset, $len;
         my $b = APR::Bucket->new($data, $offset, $len);
-        my $read = $b->read;
-        ok t_cmp($real, $read, 'new($data, $offset, $len)');
+        my $rlen = $b->read(my $read);
+        ok t_cmp($real, $read, 'new($data, $offset, $len)/buffer');
+        ok t_cmp(length($read), $rlen, 'new($data, $offse, $lent)/len');
     }

     # new: offset+ too big len
@@ -97,7 +99,9 @@
         ok t_cmp(0, $b->length, "eos b->length");

         # buckets with no data to read should return an empty string
-        ok t_cmp("", $b->read, "eos b->read");
+        my $rlen = $b->read(my $read);
+        ok t_cmp("", $read, 'eos b->read/buffer');
+        ok t_cmp(0, $rlen, 'eos b->read/len');
     }

     # flush_create
@@ -137,14 +141,16 @@
         ### now test

         my $b = $bb->first;
-        ok t_cmp("d1", $b->read, "d1 bucket");
+        $b->read(my $read);
+        ok t_cmp("d1", $read, "d1 bucket");

         $b = $bb->next($b);
         t_debug("is_flush");
         ok $b->is_flush;

         $b = $bb->next($b);
-        ok t_cmp("d2", $b->read, "d2 bucket");
+        $b->read($read);
+        ok t_cmp("d2", $read, "d2 bucket");

         $b = $bb->last();
         t_debug("is_eos");
@@ -176,7 +182,8 @@
         my $b = APR::Bucket->new("bbb");
         $bb->insert_head($b);
         my $b_first = $bb->first;
-        ok t_cmp("bbb", $b->read, "first bucket");
+        $b->read(my $read);
+        ok t_cmp("bbb", $read, "first bucket");

         # but there is no prev
         ok t_cmp(undef, $bb->prev($b_first),  "no prev bucket");
Index: t/response/TestError/runtime.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestError/runtime.pm,v
retrieving revision 1.4
diff -u -r1.4 runtime.pm
--- t/response/TestError/runtime.pm     30 May 2004 18:51:30 -0000      1.4
+++ t/response/TestError/runtime.pm     8 Jun 2004 15:59:22 -0000
@@ -85,7 +85,7 @@

 sub eval_string_mp_error {
     my($r, $socket) = @_;
-    eval "\$socket->recv(SIZE)";
+    eval '$socket->recv(my $buffer, SIZE)';
     if ($@ && ref($@) && $@ == APR::TIMEUP) {
         $r->print("ok eval_string_mp_error");
     }
@@ -121,7 +121,7 @@
 # fails because of the timeout set earlier in the handler
 sub mp_error {
     my $socket = shift;
-    $socket->recv(SIZE);
+    $socket->recv(my $buffer, SIZE);
 }

 1;
Index: xs/APR/Bucket/APR__Bucket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Bucket/APR__Bucket.h,v
retrieving revision 1.9
diff -u -r1.9 APR__Bucket.h
--- xs/APR/Bucket/APR__Bucket.h 4 Jun 2004 09:38:06 -0000       1.9
+++ xs/APR/Bucket/APR__Bucket.h 8 Jun 2004 15:59:22 -0000
@@ -35,34 +35,22 @@
     return modperl_bucket_sv_create(aTHX_ sv, offset, len);
 }

-static MP_INLINE SV *mpxs_APR__Bucket_read(pTHX_
-                                           apr_bucket *bucket,
-                                           apr_read_type_e block)
+static MP_INLINE
+apr_size_t mpxs_APR__Bucket_read(pTHX_
+                                 apr_bucket *bucket,
+                                 SV *buffer,
+                                 apr_read_type_e block)
 {
-    SV *buf;
     apr_size_t len;
     const char *str;
     apr_status_t rc = apr_bucket_read(bucket, &str, &len, block);
-
-    if (rc == APR_EOF) {
-        return newSVpvn("", 0);
-    }

-    if (rc != APR_SUCCESS) {
-        modperl_croak(aTHX_ rc, "APR::Bucket::read");
+    if (!(rc == APR_SUCCESS || rc == APR_EOF)) {
+        modperl_croak(aTHX_ rc, "APR::Bucket::read");
     }

-    /* XXX: bug in perl, newSVpvn(NULL, 0) doesn't produce "" sv */
-    if (len) {
-        buf = newSVpvn(str, len);
-    }
-    else {
-        buf = newSVpvn("", 0);
-    }
-
-    SvTAINTED_on(buf);
-
-    return buf;
+    sv_setpvn(buffer, (len ? str : ""), len);
+    return len;
 }

 static MP_INLINE int mpxs_APR__Bucket_is_eos(apr_bucket *bucket)
Index: xs/APR/Socket/APR__Socket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Socket/APR__Socket.h,v
retrieving revision 1.10
diff -u -r1.10 APR__Socket.h
--- xs/APR/Socket/APR__Socket.h 2 Jun 2004 03:34:32 -0000       1.10
+++ xs/APR/Socket/APR__Socket.h 8 Jun 2004 15:59:22 -0000
@@ -14,24 +14,22 @@
  */

 static MP_INLINE
-SV *mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket, apr_size_t len)
+apr_size_t mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket,
+                                 SV *buffer,
+                                 apr_size_t len)
 {
-    SV *buf = NEWSV(0, len);
-    apr_status_t rc = apr_socket_recv(socket, SvPVX(buf), &len);
+    apr_status_t rc;

-    if (len > 0) {
-        mpxs_sv_cur_set(buf, len);
-        SvTAINTED_on(buf);
-    }
-    else if (rc == APR_EOF) {
-        sv_setpvn(buf, "", 0);
-    }
-    else if (rc != APR_SUCCESS) {
-        SvREFCNT_dec(buf);
-        modperl_croak(aTHX_ rc, "APR::Socket::recv");
+    mpxs_sv_grow(buffer, len);
+    rc = apr_socket_recv(socket, SvPVX(buffer), &len);
+
+    if (!(rc == APR_SUCCESS || rc == APR_EOF)) {
+        modperl_croak(aTHX_ rc, "APR::Socket::recv");
     }

-    return buf;
+    mpxs_sv_cur_set(buffer, len);
+    SvTAINTED_on(buffer);
+    return len;
 }

 static MP_INLINE
Index: xs/maps/apr_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v
retrieving revision 1.81
diff -u -r1.81 apr_functions.map
--- xs/maps/apr_functions.map   4 Jun 2004 04:12:54 -0000       1.81
+++ xs/maps/apr_functions.map   8 Jun 2004 15:59:22 -0000
@@ -116,7 +116,7 @@
  mpxs_APR__Bucket_insert_before  #APR_BUCKET_INSERT_AFTER
  mpxs_APR__Bucket_remove         #APR_BUCKET_REMOVE
  #apr_bucket_read
- mpxs_APR__Bucket_read | | bucket, block=APR_BLOCK_READ
+ mpxs_APR__Bucket_read | | bucket, buffer, block=APR_BLOCK_READ
  #modperl_bucket_sv_create
  mpxs_APR__Bucket_new  | | classname, sv, offset=0, len=0
 >apr_bucket_alloc
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.162
diff -u -r1.162 FunctionTable.pm
--- xs/tables/current/ModPerl/FunctionTable.pm  2 Jun 2004 18:31:33 -0000       1.162
+++ xs/tables/current/ModPerl/FunctionTable.pm  8 Jun 2004 15:59:22 -0000
@@ -2,7 +2,7 @@

 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 # ! WARNING: generated by ModPerl::ParseSource/0.01
-# !          Wed Jun  2 11:27:15 2004
+# !          Tue Jun  8 07:27:14 2004
 # !          do NOT edit, any changes will be lost !
 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@@ -5408,12 +5408,8 @@
     ]
   },
   {
-    'return_type' => 'SV *',
+    'return_type' => 'apr_size_t',
     'name' => 'mpxs_APR__Bucket_read',
-    'attr' => [
-      'static',Index: lib/Apache/compat.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/compat.pm,v
retrieving revision 1.107
diff -u -r1.107 compat.pm
--- lib/Apache/compat.pm        4 Jun 2004 09:34:46 -0000       1.107
+++ lib/Apache/compat.pm        8 Jun 2004 15:59:21 -0000
@@ -501,8 +501,8 @@
                 last;
             }

-            my $buf = $b->read;
-            $data .= $buf if length $buf;
+            $b->read(my $buf);
+            $data .= $buf;
         }
     } while (!$seen_eos);

Index: t/conf/modperl_extra.pl
===================================================================
RCS file: /home/cvs/modperl-2.0/t/conf/modperl_extra.pl,v
retrieving revision 1.51
diff -u -r1.51 modperl_extra.pl
--- t/conf/modperl_extra.pl     4 Jun 2004 09:35:37 -0000       1.51
+++ t/conf/modperl_extra.pl     8 Jun 2004 15:59:21 -0000
@@ -164,9 +164,9 @@
                 last;
             }

-            my $buf = $b->read;
+            $b->read(my $buf);
             warn "read_post: DATA bucket: [$buf]\n" if $debug;
-            $data .= $buf if length $buf;
+            $data .= $buf;
         }

     } while (!$seen_eos);
@@ -273,7 +273,8 @@

     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
-        push @data, $b->type->name, $b->read;
+        $b->read(my $bdata);
+        push @data, $b->type->name, $bdata;
     }

     # send the sniffed info to STDERR so not to interfere with normal
Index: t/filter/TestFilter/in_bbs_body.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_body.pm,v
retrieving revision 1.5
diff -u -r1.5 in_bbs_body.pm
--- t/filter/TestFilter/in_bbs_body.pm  1 Jun 2004 23:36:16 -0000       1.5
+++ t/filter/TestFilter/in_bbs_body.pm  8 Jun 2004 15:59:21 -0000
@@ -34,7 +34,7 @@
             last;
         }

-        if (my $data = $bucket->read) {
+        if ($bucket->read(my $data)) {
             #warn"[$data]\n";
             $bucket = APR::Bucket->new(scalar reverse $data);
         }
Index: t/filter/TestFilter/in_bbs_consume.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_consume.pm,v
retrieving revision 1.4
diff -u -r1.4 in_bbs_consume.pm
--- t/filter/TestFilter/in_bbs_consume.pm       1 Jun 2004 23:36:16 -0000       1.4
+++ t/filter/TestFilter/in_bbs_consume.pm       8 Jun 2004 15:59:21 -0000
@@ -75,8 +75,7 @@
     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
         $seen_eos++, last if $b->is_eos;
-        my $bdata = $b->read;
-        $bdata = '' unless defined $bdata;
+        $b->read(my $bdata);
         push @data, $bdata;
     }
     return (join('', @data), $seen_eos);
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.8
diff -u -r1.8 in_bbs_inject_header.pm
--- t/filter/TestFilter/in_bbs_inject_header.pm 21 May 2004 22:01:16 -0000      1.8
+++ t/filter/TestFilter/in_bbs_inject_header.pm 8 Jun 2004 15:59:21 -0000
@@ -63,7 +63,7 @@

     if (1) {
         # extra debug, wasting cycles
-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "injected header: [$data]";
     }
     else {
@@ -166,7 +166,7 @@
             last;
         }

-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "filter read:\n[$data]";

         # check that we really work only on the headers
Index: t/filter/TestFilter/in_bbs_msg.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_msg.pm,v
retrieving revision 1.9
diff -u -r1.9 in_bbs_msg.pm
--- t/filter/TestFilter/in_bbs_msg.pm   1 Jun 2004 23:36:16 -0000       1.9
+++ t/filter/TestFilter/in_bbs_msg.pm   8 Jun 2004 15:59:21 -0000
@@ -38,7 +38,7 @@
             last;
         }

-        my $data = $bucket->read;
+        $bucket->read(my $data);
         debug "FILTER READ:\n$data";

         if ($data and $data =~ s,GET $from_url,GET $to_url,) {
Index: t/filter/TestFilter/in_bbs_underrun.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_underrun.pm,v
retrieving revision 1.7
diff -u -r1.7 in_bbs_underrun.pm
--- t/filter/TestFilter/in_bbs_underrun.pm      1 Jun 2004 23:36:16 -0000       1.7
+++ t/filter/TestFilter/in_bbs_underrun.pm      8 Jun 2004 15:59:21 -0000
@@ -121,8 +121,7 @@
     my @data;
     for (my $b = $bb->first; $b; $b = $bb->next($b)) {
         $seen_eos++, last if $b->is_eos;
-        my $bdata = $b->read;
-        $bdata = '' unless defined $bdata;
+        $b->read(my $bdata);
         push @data, $bdata;
     }
     return (join('', @data), $seen_eos);
Index: t/filter/TestFilter/out_bbs_basic.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_basic.pm,v
retrieving revision 1.4
diff -u -r1.4 out_bbs_basic.pm
--- t/filter/TestFilter/out_bbs_basic.pm        21 May 2004 18:40:50 -0000      1.4
+++ t/filter/TestFilter/out_bbs_basic.pm        8 Jun 2004 15:59:21 -0000
@@ -32,7 +32,7 @@
         for (my $bucket = $bb->first; $bucket; $bucket = $bb->next($bucket)) {
             ok $bucket->type->name;
             ok $bucket->length == 2;
-            my $data = $bucket->read;
+            $bucket->read(my $data);
             ok (defined $data and $data eq 'ok');
         }

Index: t/filter/TestFilter/out_bbs_ctx.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_ctx.pm,v
retrieving revision 1.5
diff -u -r1.5 out_bbs_ctx.pm
--- t/filter/TestFilter/out_bbs_ctx.pm  21 May 2004 18:40:50 -0000      1.5
+++ t/filter/TestFilter/out_bbs_ctx.pm  8 Jun 2004 15:59:22 -0000
@@ -43,8 +43,7 @@
             last;
         }

-        my $bdata = $bucket->read;
-        if (defined $bdata) {
+        if ($bucket->read(my $bdata)) {
             $data .= $bdata;
             my $len = length $data;

Index: t/protocol/TestProtocol/echo_bbs.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_bbs.pm,v
retrieving revision 1.1
diff -u -r1.1 echo_bbs.pm
--- t/protocol/TestProtocol/echo_bbs.pm 3 Jun 2004 08:20:50 -0000       1.1
+++ t/protocol/TestProtocol/echo_bbs.pm 8 Jun 2004 15:59:22 -0000
@@ -47,8 +47,7 @@
                 last;
             }

-            my $data = $bucket->read;
-            if (length $data) {
+            if ($bucket->read(my $data)) {
                 last if $data =~ /^[\r\n]+$/;
                 $bucket = APR::Bucket->new(uc $data);
             }
Index: t/protocol/TestProtocol/echo_block.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_block.pm,v
retrieving revision 1.5
diff -u -r1.5 echo_block.pm
--- t/protocol/TestProtocol/echo_block.pm       3 Jun 2004 08:22:21 -0000       1.5
+++ t/protocol/TestProtocol/echo_block.pm       8 Jun 2004 15:59:22 -0000
@@ -31,12 +31,8 @@
             or die "failed to set blocking mode";
     }

-    while (1) {
-        my $buff = $socket->recv(BUFF_LEN);
-        last unless length $buff; # EOF
-
-        my $wlen = $socket->send($buff);
-        last if $wlen != length $buff; # write failure?
+    while ($socket->recv(my $buff, BUFF_LEN)) {
+        $socket->send($buff);
     }

     Apache::OK;
Index: t/protocol/TestProtocol/echo_timeout.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_timeout.pm,v
retrieving revision 1.4
diff -u -r1.4 echo_timeout.pm
--- t/protocol/TestProtocol/echo_timeout.pm     3 Jun 2004 08:22:21 -0000       1.4
+++ t/protocol/TestProtocol/echo_timeout.pm     8 Jun 2004 15:59:22 -0000
@@ -29,20 +29,20 @@
     $socket->timeout_set(20_000_000);

     while (1) {
-        my $buff = eval { $socket->recv(BUFF_LEN) };
+        my $buff;
+        my $rlen = eval { $socket->recv($buff, BUFF_LEN) };
         if ($@) {
             die "timed out, giving up: $@" if $@ == APR::TIMEUP;
             die $@;
         }

-        last unless length $buff; # EOF
+        last unless $rlen; # EOF

         my $wlen = eval { $socket->send($buff) };
         if ($@) {
             die "timed out, giving up: $@" if $@ == APR::TIMEUP;
             die $@;
         }
-        last if $wlen != length $buff; # write failure?
     }

     Apache::OK;
Index: t/protocol/TestProtocol/eliza.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/eliza.pm,v
retrieving revision 1.6
diff -u -r1.6 eliza.pm
--- t/protocol/TestProtocol/eliza.pm    4 May 2004 06:14:44 -0000       1.6
+++ t/protocol/TestProtocol/eliza.pm    8 Jun 2004 15:59:22 -0000
@@ -19,10 +19,7 @@
     my APR::Socket $socket = $c->client_socket;

     my $last = 0;
-    while (1) {
-        my $buff = $socket->recv(BUFF_LEN);
-        last unless length $buff; # EOF
-
+    while ($socket->recv(my $buff, BUFF_LEN)) {
         # \r is sent instead of \n if the client is talking over telnet
         $buff =~ s/[\r\n]*$//;
         $last++ if $buff eq "Good bye, Eliza";
Index: t/response/TestAPR/bucket.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/bucket.pm,v
retrieving revision 1.3
diff -u -r1.3 bucket.pm
--- t/response/TestAPR/bucket.pm        4 Jun 2004 23:57:32 -0000       1.3
+++ t/response/TestAPR/bucket.pm        8 Jun 2004 15:59:22 -0000
@@ -20,7 +20,7 @@

     my $r = shift;

-    plan $r, tests => 26;
+    plan $r, tests => 29;

     my $ba = $r->connection->bucket_alloc;

@@ -47,8 +47,9 @@
         my $offset = 3;
         my $real = substr $data, $offset;
         my $b = APR::Bucket->new($data, $offset);
-        my $read = $b->read;
-        ok t_cmp($real, $read, 'new($data, $offset)');
+        my $rlen = $b->read(my $read);
+        ok t_cmp($real, $read, 'new($data, $offset)/buffer');
+        ok t_cmp(length($read), $rlen, 'new($data, $offset)/len');
         ok t_cmp($offset, $b->start, 'offset');

     }
@@ -60,8 +61,9 @@
         my $len    = 3;
         my $real = substr $data, $offset, $len;
         my $b = APR::Bucket->new($data, $offset, $len);
-        my $read = $b->read;
-        ok t_cmp($real, $read, 'new($data, $offset, $len)');
+        my $rlen = $b->read(my $read);
+        ok t_cmp($real, $read, 'new($data, $offset, $len)/buffer');
+        ok t_cmp(length($read), $rlen, 'new($data, $offse, $lent)/len');
     }

     # new: offset+ too big len
@@ -97,7 +99,9 @@
         ok t_cmp(0, $b->length, "eos b->length");

         # buckets with no data to read should return an empty string
-        ok t_cmp("", $b->read, "eos b->read");
+        my $rlen = $b->read(my $read);
+        ok t_cmp("", $read, 'eos b->read/buffer');
+        ok t_cmp(0, $rlen, 'eos b->read/len');
     }

     # flush_create
@@ -137,14 +141,16 @@
         ### now test

         my $b = $bb->first;
-        ok t_cmp("d1", $b->read, "d1 bucket");
+        $b->read(my $read);
+        ok t_cmp("d1", $read, "d1 bucket");

         $b = $bb->next($b);
         t_debug("is_flush");
         ok $b->is_flush;

         $b = $bb->next($b);
-        ok t_cmp("d2", $b->read, "d2 bucket");
+        $b->read($read);
+        ok t_cmp("d2", $read, "d2 bucket");

         $b = $bb->last();
         t_debug("is_eos");
@@ -176,7 +182,8 @@
         my $b = APR::Bucket->new("bbb");
         $bb->insert_head($b);
         my $b_first = $bb->first;
-        ok t_cmp("bbb", $b->read, "first bucket");
+        $b->read(my $read);
+        ok t_cmp("bbb", $read, "first bucket");

         # but there is no prev
         ok t_cmp(undef, $bb->prev($b_first),  "no prev bucket");
Index: t/response/TestError/runtime.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/t/response/TestError/runtime.pm,v
retrieving revision 1.4
diff -u -r1.4 runtime.pm
--- t/response/TestError/runtime.pm     30 May 2004 18:51:30 -0000      1.4
+++ t/response/TestError/runtime.pm     8 Jun 2004 15:59:22 -0000
@@ -85,7 +85,7 @@

 sub eval_string_mp_error {
     my($r, $socket) = @_;
-    eval "\$socket->recv(SIZE)";
+    eval '$socket->recv(my $buffer, SIZE)';
     if ($@ && ref($@) && $@ == APR::TIMEUP) {
         $r->print("ok eval_string_mp_error");
     }
@@ -121,7 +121,7 @@
 # fails because of the timeout set earlier in the handler
 sub mp_error {
     my $socket = shift;
-    $socket->recv(SIZE);
+    $socket->recv(my $buffer, SIZE);
 }

 1;
Index: xs/APR/Bucket/APR__Bucket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Bucket/APR__Bucket.h,v
retrieving revision 1.9
diff -u -r1.9 APR__Bucket.h
--- xs/APR/Bucket/APR__Bucket.h 4 Jun 2004 09:38:06 -0000       1.9
+++ xs/APR/Bucket/APR__Bucket.h 8 Jun 2004 15:59:22 -0000
@@ -35,34 +35,22 @@
     return modperl_bucket_sv_create(aTHX_ sv, offset, len);
 }

-static MP_INLINE SV *mpxs_APR__Bucket_read(pTHX_
-                                           apr_bucket *bucket,
-                                           apr_read_type_e block)
+static MP_INLINE
+apr_size_t mpxs_APR__Bucket_read(pTHX_
+                                 apr_bucket *bucket,
+                                 SV *buffer,
+                                 apr_read_type_e block)
 {
-    SV *buf;
     apr_size_t len;
     const char *str;
     apr_status_t rc = apr_bucket_read(bucket, &str, &len, block);
-
-    if (rc == APR_EOF) {
-        return newSVpvn("", 0);
-    }

-    if (rc != APR_SUCCESS) {
-        modperl_croak(aTHX_ rc, "APR::Bucket::read");
+    if (!(rc == APR_SUCCESS || rc == APR_EOF)) {
+        modperl_croak(aTHX_ rc, "APR::Bucket::read");
     }

-    /* XXX: bug in perl, newSVpvn(NULL, 0) doesn't produce "" sv */
-    if (len) {
-        buf = newSVpvn(str, len);
-    }
-    else {
-        buf = newSVpvn("", 0);
-    }
-
-    SvTAINTED_on(buf);
-
-    return buf;
+    sv_setpvn(buffer, (len ? str : ""), len);
+    return len;
 }

 static MP_INLINE int mpxs_APR__Bucket_is_eos(apr_bucket *bucket)
Index: xs/APR/Socket/APR__Socket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Socket/APR__Socket.h,v
retrieving revision 1.10
diff -u -r1.10 APR__Socket.h
--- xs/APR/Socket/APR__Socket.h 2 Jun 2004 03:34:32 -0000       1.10
+++ xs/APR/Socket/APR__Socket.h 8 Jun 2004 15:59:22 -0000
@@ -14,24 +14,22 @@
  */

 static MP_INLINE
-SV *mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket, apr_size_t len)
+apr_size_t mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket,
+                                 SV *buffer,
+                                 apr_size_t len)
 {
-    SV *buf = NEWSV(0, len);
-    apr_status_t rc = apr_socket_recv(socket, SvPVX(buf), &len);
+    apr_status_t rc;

-    if (len > 0) {
-        mpxs_sv_cur_set(buf, len);
-        SvTAINTED_on(buf);
-    }
-    else if (rc == APR_EOF) {
-        sv_setpvn(buf, "", 0);
-    }
-    else if (rc != APR_SUCCESS) {
-        SvREFCNT_dec(buf);
-        modperl_croak(aTHX_ rc, "APR::Socket::recv");
+    mpxs_sv_grow(buffer, len);
+    rc = apr_socket_recv(socket, SvPVX(buffer), &len);
+
+    if (!(rc == APR_SUCCESS || rc == APR_EOF)) {
+        modperl_croak(aTHX_ rc, "APR::Socket::recv");
     }

-    return buf;
+    mpxs_sv_cur_set(buffer, len);
+    SvTAINTED_on(buffer);
+    return len;
 }

 static MP_INLINE
Index: xs/maps/apr_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v
retrieving revision 1.81
diff -u -r1.81 apr_functions.map
--- xs/maps/apr_functions.map   4 Jun 2004 04:12:54 -0000       1.81
+++ xs/maps/apr_functions.map   8 Jun 2004 15:59:22 -0000
@@ -116,7 +116,7 @@
  mpxs_APR__Bucket_insert_before  #APR_BUCKET_INSERT_AFTER
  mpxs_APR__Bucket_remove         #APR_BUCKET_REMOVE
  #apr_bucket_read
- mpxs_APR__Bucket_read | | bucket, block=APR_BLOCK_READ
+ mpxs_APR__Bucket_read | | bucket, buffer, block=APR_BLOCK_READ
  #modperl_bucket_sv_create
  mpxs_APR__Bucket_new  | | classname, sv, offset=0, len=0
 >apr_bucket_alloc
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.162
diff -u -r1.162 FunctionTable.pm
--- xs/tables/current/ModPerl/FunctionTable.pm  2 Jun 2004 18:31:33 -0000       1.162
+++ xs/tables/current/ModPerl/FunctionTable.pm  8 Jun 2004 15:59:22 -0000
@@ -2,7 +2,7 @@

 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 # ! WARNING: generated by ModPerl::ParseSource/0.01
-# !          Wed Jun  2 11:27:15 2004
+# !          Tue Jun  8 07:27:14 2004
 # !          do NOT edit, any changes will be lost !
 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

@@ -5408,12 +5408,8 @@
     ]
   },
   {
-    'return_type' => 'SV *',
+    'return_type' => 'apr_size_t',
     'name' => 'mpxs_APR__Bucket_read',
-    'attr' => [
-      'static',
-      '__inline__'
-    ],
     'args' => [
       {
         'type' => 'PerlInterpreter *',
@@ -5424,6 +5420,10 @@
         'name' => 'bucket'
       },
       {
+        'type' => 'SV *',
+        'name' => 'buffer'
+      },
+      {
         'type' => 'apr_read_type_e',
         'name' => 'block'
       }
@@ -5524,7 +5524,7 @@
     ]
   },
   {
-    'return_type' => 'SV *',
+    'return_type' => 'apr_size_t',
     'name' => 'mpxs_APR__Socket_recv',
     'args' => [
       {
@@ -5534,6 +5534,10 @@
       {
         'type' => 'apr_socket_t *',
         'name' => 'socket'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'buffer'
       },
       {
         'type' => 'apr_size_t',

-      '__inline__'
-    ],
     'args' => [
       {
         'type' => 'PerlInterpreter *',
@@ -5424,6 +5420,10 @@
         'name' => 'bucket'
       },
       {
+        'type' => 'SV *',
+        'name' => 'buffer'
+      },
+      {
         'type' => 'apr_read_type_e',
         'name' => 'block'
       }
@@ -5524,7 +5524,7 @@
     ]
   },
   {
-    'return_type' => 'SV *',
+    'return_type' => 'apr_size_t',
     'name' => 'mpxs_APR__Socket_recv',
     'args' => [
       {
@@ -5534,6 +5534,10 @@
       {
         'type' => 'apr_socket_t *',
         'name' => 'socket'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'buffer'
       },
       {
         'type' => 'apr_size_t',



--
__________________________________________________________________
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