From: Eric Wong <e@80x24.org> To: meta@public-inbox.org Subject: [PATCH 26/57] ds: favor `delete' over assigning fields to `undef' Date: Mon, 24 Jun 2019 02:52:27 +0000 Message-ID: <20190624025258.25592-27-e@80x24.org> (raw) In-Reply-To: <20190624025258.25592-1-e@80x24.org> This is cleaner in most cases and may allow Perl to reuse memory from unused fields. We can do this now that we no longer support Perl 5.8; since Danga::Socket was written with struct-like pseudo-hash support in mind, and Perl 5.9+ dropped support for pseudo-hashes over a decade ago. --- lib/PublicInbox/DS.pm | 1 + lib/PublicInbox/HTTP.pm | 21 +++++++++------------ lib/PublicInbox/HTTPD/Async.pm | 9 +++++---- lib/PublicInbox/NNTP.pm | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index f5986e55..482710f7 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -23,6 +23,7 @@ use Time::HiRes qw(clock_gettime CLOCK_MONOTONIC); use parent qw(Exporter); our @EXPORT_OK = qw(now msg_more write_in_full); use warnings; +use 5.010_001; use PublicInbox::Syscall qw(:epoll); diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm index 4738e156..94972054 100644 --- a/lib/PublicInbox/HTTP.pm +++ b/lib/PublicInbox/HTTP.pm @@ -118,8 +118,7 @@ sub read_input ($) { # env->{CONTENT_LENGTH} (identity) my $sock = $self->{sock}; - my $len = $self->{input_left}; - $self->{input_left} = undef; + my $len = delete $self->{input_left}; my $rbuf = \($self->{rbuf}); my $input = $env->{'psgi.input'}; @@ -246,8 +245,7 @@ sub next_request ($) { sub response_done_cb ($$) { my ($self, $alive) = @_; sub { - my $env = $self->{env}; - $self->{env} = undef; + my $env = delete $self->{env}; $self->write(\"0\r\n\r\n") if $alive == 2; $self->write(sub{$alive ? next_request($self) : $self->close}); } @@ -279,7 +277,7 @@ sub getline_cb ($$$) { } } - $self->{forward} = $self->{pull} = undef; + delete @$self{qw(forward pull)}; # avoid recursion if ($forward) { eval { $forward->close }; @@ -370,8 +368,7 @@ sub read_input_chunked { # unlikely... my ($self) = @_; my $input = $self->{env}->{'psgi.input'}; my $sock = $self->{sock}; - my $len = $self->{input_left}; - $self->{input_left} = undef; + my $len = delete $self->{input_left}; my $rbuf = \($self->{rbuf}); while (1) { # chunk start @@ -442,11 +439,11 @@ sub quit { sub close { my $self = shift; - my $forward = $self->{forward}; - my $env = $self->{env}; - delete $env->{'psgix.io'} if $env; # prevent circular references - $self->{pull} = $self->{forward} = $self->{env} = undef; - if ($forward) { + if (my $env = delete $self->{env}) { + delete $env->{'psgix.io'}; # prevent circular references + } + delete $self->{pull}; + if (my $forward = delete $self->{forward}) { eval { $forward->close }; err($self, "forward ->close error: $@") if $@; } diff --git a/lib/PublicInbox/HTTPD/Async.pm b/lib/PublicInbox/HTTPD/Async.pm index 9cc41f17..bec49337 100644 --- a/lib/PublicInbox/HTTPD/Async.pm +++ b/lib/PublicInbox/HTTPD/Async.pm @@ -63,7 +63,7 @@ sub main_cb ($$$) { # Done! Error handling will happen in $fh->close # called by the {cleanup} handler - $http->{forward} = undef; + delete $http->{forward}; $self->close; } } @@ -81,12 +81,13 @@ sub event_step { $_[0]->{cb}->(@_) } sub close { my $self = shift; - my $cleanup = $self->{cleanup}; - $self->{cleanup} = $self->{cb} = undef; + delete $self->{cb}; $self->SUPER::close(@_); # we defer this to the next timer loop since close is deferred - PublicInbox::EvCleanup::next_tick($cleanup) if $cleanup; + if (my $cleanup = delete $self->{cleanup}) { + PublicInbox::EvCleanup::next_tick($cleanup); + } } 1; diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index fbdf1364..6a582ea4 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -624,7 +624,7 @@ sub long_response ($$) { $self->{long_res} = sub { my $more = eval { $cb->() }; if ($@ || !$self->{sock}) { # something bad happened... - $self->{long_res} = undef; + delete $self->{long_res}; if ($@) { err($self, @@ -646,7 +646,7 @@ sub long_response ($$) { push @$nextq, $self; $nextt ||= PublicInbox::EvCleanup::asap(*next_tick); } else { # all done! - $self->{long_res} = undef; + delete $self->{long_res}; check_read($self); res($self, '.'); out($self, " deferred[$fd] done - %0.6f", now() - $t0); -- EW
next prev parent reply index Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-06-24 2:52 [PATCH 00/57] ds: shrink, TLS support, buffer writes to FS Eric Wong 2019-06-24 2:52 ` [PATCH 01/57] ds: get rid of {closed} field Eric Wong 2019-06-24 2:52 ` [PATCH 02/57] ds: get rid of more unused debug instance methods Eric Wong 2019-06-24 2:52 ` [PATCH 03/57] ds: use and export monotonic now() Eric Wong 2019-06-24 2:52 ` [PATCH 04/57] AddTimer: avoid clock_gettime for the '0' case Eric Wong 2019-06-24 2:52 ` [PATCH 05/57] ds: get rid of on_incomplete_write wrapper Eric Wong 2019-06-24 2:52 ` [PATCH 06/57] ds: lazy initialize wbuf_off Eric Wong 2019-06-24 2:52 ` [PATCH 07/57] ds: split out from ->flush_write and ->write Eric Wong 2019-06-24 2:52 ` [PATCH 08/57] ds: lazy-initialize wbuf Eric Wong 2019-06-24 2:52 ` [PATCH 09/57] ds: don't pass `events' arg to EPOLL_CTL_DEL Eric Wong 2019-06-24 2:52 ` [PATCH 10/57] ds: remove support for DS->write(undef) Eric Wong 2019-06-24 2:52 ` [PATCH 11/57] http: favor DS->write(strref) when reasonable Eric Wong 2019-06-24 2:52 ` [PATCH 12/57] ds: share send(..., MSG_MORE) logic Eric Wong 2019-06-24 2:52 ` [PATCH 13/57] ds: switch write buffering to use a tempfile Eric Wong 2019-06-24 2:52 ` [PATCH 14/57] ds: get rid of redundant and unnecessary POLL* constants Eric Wong 2019-06-24 2:52 ` [PATCH 15/57] syscall: get rid of unused EPOLL* constants Eric Wong 2019-06-24 2:52 ` [PATCH 16/57] syscall: get rid of unnecessary uname local vars Eric Wong 2019-06-24 2:52 ` [PATCH 17/57] ds: set event flags directly at initialization Eric Wong 2019-06-24 2:52 ` [PATCH 18/57] ds: import IO::KQueue namespace Eric Wong 2019-06-24 2:52 ` [PATCH 19/57] ds: share watch_chg between watch_read/watch_write Eric Wong 2019-06-24 2:52 ` [PATCH 20/57] ds: remove IO::Poll support (for now) Eric Wong 2019-06-24 2:52 ` [PATCH 21/57] ds: get rid of event_watch field Eric Wong 2019-06-24 2:52 ` [PATCH 22/57] httpd/async: remove EINTR check Eric Wong 2019-06-24 2:52 ` [PATCH 23/57] spawn: remove `Blocking' flag handling Eric Wong 2019-06-24 2:52 ` [PATCH 24/57] qspawn: describe where `$rpipe' come from Eric Wong 2019-06-24 2:52 ` [PATCH 25/57] http|nntp: favor "$! == EFOO" over $!{EFOO} checks Eric Wong 2019-06-24 2:52 ` Eric Wong [this message] 2019-06-24 2:52 ` [PATCH 27/57] http: don't pass extra args to PublicInbox::DS::close Eric Wong 2019-06-24 2:52 ` [PATCH 28/57] ds: pass $self to code references Eric Wong 2019-06-24 2:52 ` [PATCH 29/57] evcleanup: replace _run_asap with `event_step' callback Eric Wong 2019-06-24 2:52 ` [PATCH 30/57] ds: remove pointless exit calls Eric Wong 2019-06-24 2:52 ` [PATCH 31/57] http|nntp: be explicit about bytes::length on rbuf Eric Wong 2019-06-24 2:52 ` [PATCH 32/57] ds: hoist out do_read from NNTP and HTTP Eric Wong 2019-06-24 2:52 ` [PATCH 33/57] nntp: simplify re-arming/requeue logic Eric Wong 2019-06-24 2:52 ` [PATCH 34/57] allow use of PerlIO layers for filesystem writes Eric Wong 2019-06-24 2:52 ` [PATCH 35/57] ds: deal better with FS-related errors IO buffers Eric Wong 2019-06-24 2:52 ` [PATCH 36/57] nntp: wait for writability before sending greeting Eric Wong 2019-06-24 2:52 ` [PATCH 37/57] nntp: NNTPS and NNTP+STARTTLS working Eric Wong 2019-06-24 2:52 ` [PATCH 38/57] certs/create-certs.perl: fix cert validity on 32-bit Eric Wong 2019-06-24 2:52 ` [PATCH 39/57] daemon: map inherited sockets to well-known schemes Eric Wong 2019-06-24 2:52 ` [PATCH 40/57] ds|nntp: use CORE::close on socket Eric Wong 2019-06-24 2:52 ` [PATCH 41/57] nntp: call SSL_shutdown in normal cases Eric Wong 2019-06-24 2:52 ` [PATCH 42/57] t/nntpd-tls: slow client connection test Eric Wong 2019-06-24 2:52 ` [PATCH 43/57] daemon: use SSL_MODE_RELEASE_BUFFERS Eric Wong 2019-06-24 2:52 ` [PATCH 44/57] ds: allow ->write callbacks to syswrite directly Eric Wong 2019-06-24 2:52 ` [PATCH 45/57] nntp: reduce allocations for greeting Eric Wong 2019-06-24 2:52 ` [PATCH 46/57] ds: always use EV_ADD with EV_SET Eric Wong 2019-06-24 2:52 ` [PATCH 47/57] nntp: simplify long response logic and fix nesting Eric Wong 2019-06-24 2:52 ` [PATCH 48/57] ds: flush_write runs ->write callbacks even if closed Eric Wong 2019-06-24 2:52 ` [PATCH 49/57] nntp: lazily allocate and stash rbuf Eric Wong 2019-06-24 2:52 ` [PATCH 50/57] ci: require IO::KQueue on FreeBSD, for now Eric Wong 2019-06-24 2:52 ` [PATCH 51/57] nntp: send greeting immediately for plain sockets Eric Wong 2019-06-24 2:52 ` [PATCH 52/57] daemon: set TCP_DEFER_ACCEPT on everything but NNTP Eric Wong 2019-06-24 2:52 ` [PATCH 53/57] daemon: use FreeBSD accept filters on non-NNTP Eric Wong 2019-06-24 2:52 ` [PATCH 54/57] ds: split out IO::KQueue-specific code Eric Wong 2019-06-24 5:24 ` Eric Wong 2019-06-24 2:52 ` [PATCH 55/57] ds: reimplement IO::Poll support to look like epoll Eric Wong 2019-06-24 2:52 ` [PATCH 56/57] Revert "ci: require IO::KQueue on FreeBSD, for now" Eric Wong 2019-06-24 2:52 ` [PATCH 57/57] ds: reduce overhead of tempfile creation Eric Wong 2019-06-24 5:25 ` [PATCH 58/57] Makefile: skip DSKQXS in global syntax check Eric Wong 2019-06-24 18:28 ` [PATCH 59/57] ds: ->write must not clobber empty wbuf array Eric Wong
Reply instructions: You may reply publically to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style List information: http://public-inbox.org/README * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190624025258.25592-27-e@80x24.org \ --to=e@80x24.org \ --cc=meta@public-inbox.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
user/dev discussion of public-inbox itself Archives are clonable: git clone --mirror http://public-inbox.org/meta git clone --mirror http://czquwvybam4bgbro.onion/meta git clone --mirror http://hjrcffqmbrq6wope.onion/meta git clone --mirror http://ou63pmih66umazou.onion/meta Example config snippet for mirrors Newsgroups are available over NNTP: nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta nntp://ou63pmih66umazou.onion/inbox.comp.mail.public-inbox.meta nntp://czquwvybam4bgbro.onion/inbox.comp.mail.public-inbox.meta nntp://hjrcffqmbrq6wope.onion/inbox.comp.mail.public-inbox.meta nntp://news.gmane.org/gmane.mail.public-inbox.general note: .onion URLs require Tor: https://www.torproject.org/ AGPL code for this site: git clone https://public-inbox.org/public-inbox.git