From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 734E01FA31 for ; Tue, 17 Jan 2023 07:19:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1673939952; bh=MT2rySoNaFmN0iIXb7lQcpomEp/cUK1ARys2fw6q9Co=; h=From:To:Subject:Date:In-Reply-To:References:From; b=Iks8sIf1HC6DpHnvrkPlbvwjm2E1wIPq1FW2XkaPKahGJRaa1UQ12jrMZYa3gqxFS 9u21Jl0SkRjp/AE+qlltBrKSNEfNQOuc7swFUhNajYYyHnlK+5CoqnBwjHo66/v6J7 DAansxZdt6/fM27VvJGABjztQoHUbyoCz69uEMNs= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 07/12] watch: simplify internal data structures Date: Tue, 17 Jan 2023 07:19:06 +0000 Message-Id: <20230117071911.1577890-8-e@80x24.org> In-Reply-To: <20230117071911.1577890-1-e@80x24.org> References: <20230117071911.1577890-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: We can flatten arrays and avoid distinguishing between PID types now that more of that logic and argument passing logic is offloaded to awaitpid. --- lib/PublicInbox/Watch.pm | 49 ++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/lib/PublicInbox/Watch.pm b/lib/PublicInbox/Watch.pm index 57985083..66b0c8b1 100644 --- a/lib/PublicInbox/Watch.pm +++ b/lib/PublicInbox/Watch.pm @@ -243,11 +243,7 @@ sub quit_done ($) { return unless $self->{quit}; # don't have reliable wakeups, keep signalling - my $live = 0; - for (qw(idle_pids poll_pids)) { - my $pids = $self->{$_} or next; - $live += grep { kill('QUIT', $_) } keys %$pids; - } + my $live = grep { kill('QUIT', $_) } keys %{$self->{pids}}; add_timer(0.01, \&quit_done, $self) if $live; $live == 0; } @@ -379,8 +375,7 @@ sub watch_imap_idle_1 ($$$) { sub watch_atfork_child ($) { my ($self) = @_; - delete $self->{idle_pids}; - delete $self->{poll_pids}; + delete $self->{pids}; delete $self->{opendirs}; PublicInbox::DS->Reset; my $sig = delete $self->{sig}; @@ -392,27 +387,23 @@ sub watch_atfork_child ($) { sub watch_atfork_parent ($) { _done_for_now($_[0]) } sub imap_idle_requeue { # DS::add_timer callback - my ($self, $uri_intvl) = @_; + my ($self, $uri, $intvl) = @_; return if $self->{quit}; - push @{$self->{idle_todo}}, $uri_intvl; + push @{$self->{idle_todo}}, $uri, $intvl; event_step($self); } sub imap_idle_reap { # awaitpid callback - my ($pid, $self) = @_; - my $uri_intvl = delete $self->{idle_pids}->{$pid} or - die "BUG: PID=$pid (unknown) reaped: \$?=$?\n"; - - my ($uri, $intvl) = @$uri_intvl; + my ($pid, $self, $uri, $intvl) = @_; + delete $self->{pids}->{$pid}; return if $self->{quit}; warn "W: PID=$pid on $uri died: \$?=$?\n" if $?; - add_timer(60, \&imap_idle_requeue, $self, $uri_intvl); + add_timer(60, \&imap_idle_requeue, $self, $uri, $intvl); } -sub imap_idle_fork ($$) { - my ($self, $uri_intvl) = @_; +sub imap_idle_fork { + my ($self, $uri, $intvl) = @_; return if $self->{quit}; - my ($uri, $intvl) = @$uri_intvl; my $seed = rand(0xffffffff); my $pid = fork // die "fork: $!"; if ($pid == 0) { @@ -422,8 +413,8 @@ sub imap_idle_fork ($$) { watch_imap_idle_1($self, $uri, $intvl); _exit(0); } - $self->{idle_pids}->{$pid} = $uri_intvl; - awaitpid($pid, \&imap_idle_reap, $self); + $self->{pids}->{$pid} = undef; + awaitpid($pid, \&imap_idle_reap, $self, $uri, $intvl); } sub event_step { @@ -433,8 +424,8 @@ sub event_step { if ($idle_todo && @$idle_todo) { watch_atfork_parent($self); eval { - while (my $uri_intvl = shift(@$idle_todo)) { - imap_idle_fork($self, $uri_intvl); + while (my ($uri, $intvl) = splice(@$idle_todo, 0, 2)) { + imap_idle_fork($self, $uri, $intvl); } }; die $@ if $@; @@ -486,16 +477,14 @@ sub poll_fetch_fork { # DS::add_timer callback } _exit(0); } - $self->{poll_pids}->{$pid} = [ $intvl, $uris ]; - awaitpid($pid, \&poll_fetch_reap, $self); + $self->{pids}->{$pid} = undef; + awaitpid($pid, \&poll_fetch_reap, $self, $intvl, $uris); } sub poll_fetch_reap { # awaitpid callback - my ($pid, $self) = @_; - my $intvl_uris = delete $self->{poll_pids}->{$pid} or - die "BUG: PID=$pid (unknown) reaped: \$?=$?\n"; + my ($pid, $self, $intvl, $uris) = @_; + delete $self->{pids}->{$pid}; return if $self->{quit}; - my ($intvl, $uris) = @$intvl_uris; if ($?) { warn "W: PID=$pid died: \$?=$?\n", map { "$_\n" } @$uris; } @@ -506,14 +495,14 @@ sub poll_fetch_reap { # awaitpid callback sub watch_imap_init ($$) { my ($self, $poll) = @_; my $mics = PublicInbox::NetReader::imap_common_init($self); - my $idle = []; # [ [ uri1, intvl1 ], [uri2, intvl2] ] + my $idle = []; # [ uri1, intvl1, uri2, intvl2 ] for my $uri (@{$self->{imap_order}}) { my $sec = uri_section($uri); my $mic = $mics->{$sec}; my $intvl = $self->{cfg_opt}->{$sec}->{pollInterval}; if ($mic->has_capability('IDLE') && !$intvl) { $intvl = $self->{cfg_opt}->{$sec}->{idleInterval}; - push @$idle, [ $uri, $intvl // () ]; + push @$idle, $uri, $intvl; } else { push @{$poll->{$intvl || 120}}, $uri; }