user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
Search results ordered by [date|relevance]  view[summary|nested|Atom feed]
thread overview below | download mbox.gz: |
* [PATCH 06/11] ds|http|nntp: simplify {wbuf} population
  2020-01-12 21:17  7% [PATCH 00/11] ds: various cleanups and fixes Eric Wong
@ 2020-01-12 21:17  5% ` Eric Wong
  0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2020-01-12 21:17 UTC (permalink / raw)
  To: meta

We can rely on autovification to turn `undef' value of {wbuf}
into an arrayref.

Furthermore, "push" returns the (new) size of the array since at
least Perl 5.0 (I didn't look further back), so we can use that
return value instead of calling "scalar" again.
---
 lib/PublicInbox/DS.pm   | 11 +++++------
 lib/PublicInbox/HTTP.pm |  6 +++---
 lib/PublicInbox/NNTP.pm | 11 +++++------
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index 52b11386..7a4aa7cc 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -31,7 +31,7 @@ use PublicInbox::Tmpfile;
 
 use fields ('sock',              # underlying socket
             'rbuf',              # scalarref, usually undef
-            'wbuf',              # arrayref of coderefs or GLOB refs
+            'wbuf', # arrayref of coderefs or GLOB refs (autovivified)
             'wbuf_off',  # offset into first element of wbuf to start writing at
             );
 
@@ -555,7 +555,7 @@ sub write {
 
         # wbuf may be an empty array if we're being called inside
         # ->flush_write via CODE bref:
-        push @{$self->{wbuf} ||= []}, $tmpio;
+        push @{$self->{wbuf}}, $tmpio; # autovivifies
         return 0;
     }
 }
@@ -575,8 +575,7 @@ sub msg_more ($$) {
             return 1 if $nlen == 0; # all done!
             # queue up the unwritten substring:
             my $tmpio = tmpio($self, \($_[1]), $n) or return 0;
-            $self->{wbuf} //= $wbuf //= [];
-            push @$wbuf, $tmpio;
+            push @{$self->{wbuf}}, $tmpio; # autovivifies
             epwait($sock, EPOLLOUT|EPOLLONESHOT);
             return 0;
         }
@@ -599,7 +598,7 @@ sub accept_tls_step ($) {
     return 1 if $sock->accept_SSL;
     return $self->close if $! != EAGAIN;
     epwait($sock, PublicInbox::TLS::epollbit() | EPOLLONESHOT);
-    unshift @{$self->{wbuf} ||= []}, \&accept_tls_step;
+    unshift(@{$self->{wbuf}}, \&accept_tls_step); # autovivifies
     0;
 }
 
@@ -610,7 +609,7 @@ sub shutdn_tls_step ($) {
     return $self->close if $sock->stop_SSL(SSL_fast_shutdown => 1);
     return $self->close if $! != EAGAIN;
     epwait($sock, PublicInbox::TLS::epollbit() | EPOLLONESHOT);
-    unshift @{$self->{wbuf} ||= []}, \&shutdn_tls_step;
+    unshift(@{$self->{wbuf}}, \&shutdn_tls_step); # autovivifies
     0;
 }
 
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index a6ec1d0d..5fecf292 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -280,12 +280,12 @@ sub getline_pull {
 		}
 
 		if ($self->{sock}) {
-			my $wbuf = $self->{wbuf} //= [];
-			push @$wbuf, \&getline_pull;
+			# autovivify wbuf
+			my $new_size = push(@{$self->{wbuf}}, \&getline_pull);
 
 			# wbuf may be populated by {chunked,identity}_write()
 			# above, no need to rearm if so:
-			$self->requeue if scalar(@$wbuf) == 1;
+			$self->requeue if $new_size == 1;
 			return; # likely
 		}
 	} elsif ($@) {
diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm
index 9f0dfaaa..35729f00 100644
--- a/lib/PublicInbox/NNTP.pm
+++ b/lib/PublicInbox/NNTP.pm
@@ -616,20 +616,19 @@ sub long_step {
 		# each other's data
 		$self->zflush;
 
-		# no recursion, schedule another call ASAP
-		# but only after all pending writes are done
-		my $wbuf = $self->{wbuf} ||= [];
-		push @$wbuf, \&long_step;
+		# no recursion, schedule another call ASAP, but only after
+		# all pending writes are done.  autovivify wbuf:
+		my $new_size = push(@{$self->{wbuf}}, \&long_step);
 
 		# wbuf may be populated by $cb, no need to rearm if so:
-		$self->requeue if scalar(@$wbuf) == 1;
+		$self->requeue if $new_size == 1;
 	} else { # all done!
 		delete $self->{long_cb};
 		res($self, '.');
 		my $elapsed = now() - $t0;
 		my $fd = fileno($self->{sock});
 		out($self, " deferred[$fd] done - %0.6f", $elapsed);
-		my $wbuf = $self->{wbuf};
+		my $wbuf = $self->{wbuf}; # do NOT autovivify
 		$self->requeue unless $wbuf && @$wbuf;
 	}
 }

^ permalink raw reply related	[relevance 5%]

* [PATCH 00/11] ds: various cleanups and fixes
@ 2020-01-12 21:17  7% Eric Wong
  2020-01-12 21:17  5% ` [PATCH 06/11] ds|http|nntp: simplify {wbuf} population Eric Wong
  0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2020-01-12 21:17 UTC (permalink / raw)
  To: meta

Start taking advantage of autovivification to simplify our code
and reduce allocations.  Also, I believe it's my first time
using the return value of "push".

Eric Wong (11):
  ds: new: avoid redundant check, make clobbering fatal
  ds: add_timer: rename from AddTimer, remove a parameter
  ds: add an in_loop() function for Inbox.pm use
  ds: remove Timer->cancel and Timer class+bless
  ds: PostEventLoop: guard ToClose against DESTROY side-effects
  ds|http|nntp: simplify {wbuf} population
  ds: rely on autovivification for nextq
  ds: rely on autovivication for waitpid bits
  ds: rely on autovivification for $later_queue
  ds: flatten $EXPMAP, delete entries on close
  sigfd: simplify loop and improve documentation

 lib/PublicInbox/DS.pm    | 200 +++++++++++++++++----------------------
 lib/PublicInbox/HTTP.pm  |   6 +-
 lib/PublicInbox/Inbox.pm |   2 +-
 lib/PublicInbox/NNTP.pm  |  11 +--
 lib/PublicInbox/Sigfd.pm |  13 +--
 t/ds-leak.t              |   2 +-
 6 files changed, 105 insertions(+), 129 deletions(-)

^ permalink raw reply	[relevance 7%]

Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2020-01-12 21:17  7% [PATCH 00/11] ds: various cleanups and fixes Eric Wong
2020-01-12 21:17  5% ` [PATCH 06/11] ds|http|nntp: simplify {wbuf} population Eric Wong

Code repositories for project(s) associated with this public inbox

	https://80x24.org/public-inbox.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).