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,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, T_SCC_BODY_TEXT_LINE 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 45F581F461 for ; Sat, 11 Nov 2023 23:35:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1699745713; bh=acBlxP40ZyjGwOIH3fwpS+xuOiium037M1yIqQjlEUM=; h=From:To:Subject:Date:In-Reply-To:References:From; b=kTQe2e4SBfCtT33aH+4b3sAniIdrjy7Oxk6ygZcTSZFU8S8E1pHtaHhRcutZOMume KlbsDE9LYLUHPOZJDpOacd27ik0dNmAx30ONoKHz2+JQTqTGGpPMejAE8qyPwBfY/C g8RGP/OPchpBvF7O4OWIZsfh6QVnd9g748/0484Y= From: Eric Wong To: spew@80x24.org Subject: [PATCH 3/3] xap_client: spawn C++ xap_helper directly Date: Sat, 11 Nov 2023 23:35:12 +0000 Message-ID: <20231111233512.1678903-3-e@80x24.org> In-Reply-To: <20231111233512.1678903-1-e@80x24.org> References: <20231111233512.1678903-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: No need to suffer through slow Perl load times when we can build in the parent Perl process and get the executable path name to pass to spawn directly. --- lib/PublicInbox/XapClient.pm | 28 ++++++++++++++-------------- lib/PublicInbox/XapHelperCxx.pm | 9 ++++----- t/xap_helper.t | 22 +++++++++------------- 3 files changed, 27 insertions(+), 32 deletions(-) diff --git a/lib/PublicInbox/XapClient.pm b/lib/PublicInbox/XapClient.pm index 21c89265..dda5e044 100644 --- a/lib/PublicInbox/XapClient.pm +++ b/lib/PublicInbox/XapClient.pm @@ -11,7 +11,7 @@ use v5.12; use PublicInbox::Spawn qw(spawn); use Socket qw(AF_UNIX SOCK_SEQPACKET); use PublicInbox::IPC; -use autodie qw(pipe socketpair); +use autodie qw(fork pipe socketpair); sub mkreq { my ($self, $ios, @arg) = @_; @@ -28,19 +28,19 @@ sub mkreq { sub start_helper { my @argv = @_; socketpair(my $sock, my $in, AF_UNIX, SOCK_SEQPACKET, 0); - my $cls = ($ENV{PI_NO_CXX} ? undef : eval { - require PublicInbox::XapHelperCxx; - PublicInbox::XapHelperCxx::check_build(); - 'PublicInbox::XapHelperCxx'; - }) // do { - require PublicInbox::XapHelper; - 'PublicInbox::XapHelper'; - }; - # ensure the child process has the same @INC we do: - my $env = { PERL5LIB => join(':', @INC) }; - my $pid = spawn([$^X, ($^W ? ('-w') : ()), "-M$cls", '-e', - $cls.'::start(@ARGV)', '--', @argv], - $env, { 0 => $in }); + require PublicInbox::XapHelperCxx; + my $cls = 'PublicInbox::XapHelperCxx'; + my $env; + my $cmd = eval { PublicInbox::XapHelperCxx::cmd() }; + if ($@) { # fall back to Perl + XS|SWIG + require PublicInbox::XapHelper; + $cls = 'PublicInbox::XapHelper'; + # ensure the child process has the same @INC we do: + $env = { PERL5LIB => join(':', @INC) }; + $cmd = [$^X, ($^W ? ('-w') : ()), "-M$cls", '-e', + $cls.'::start(@ARGV)', '--' ]; + } + my $pid = spawn($cmd, $env, { 0 => $in }); ((bless { io => $sock, impl => $cls }, __PACKAGE__), $pid); } diff --git a/lib/PublicInbox/XapHelperCxx.pm b/lib/PublicInbox/XapHelperCxx.pm index 88a83438..e257fb6e 100644 --- a/lib/PublicInbox/XapHelperCxx.pm +++ b/lib/PublicInbox/XapHelperCxx.pm @@ -113,17 +113,16 @@ sub check_build () { needs_rebuild() ? build() : 0; } -sub start (@) { +# returns spawn arg +sub cmd { check_build(); my @cmd; if (my $v = $ENV{VALGRIND}) { $v = 'valgrind -v' if $v eq '1'; @cmd = split(/\s+/, $v); } - push @cmd, $bin, @_; - my $prog = $cmd[0]; - $cmd[0] =~ s!\A.*?/([^/]+)\z!$1!; - exec { $prog } @cmd; + push @cmd, $bin; + \@cmd; } 1; diff --git a/t/xap_helper.t b/t/xap_helper.t index 7890392d..83f59d7d 100644 --- a/t/xap_helper.t +++ b/t/xap_helper.t @@ -61,11 +61,11 @@ my $doreq = sub { my $env = { PERL5LIB => join(':', @INC) }; my $test = sub { - my (@arg) = @_; + my (@cmd) = @_; socketpair(my $s, my $y, AF_UNIX, SOCK_SEQPACKET, 0); - my $pid = spawn([$^X, '-w', @arg], $env, { 0 => $y }); + my $pid = spawn(\@cmd, $env, { 0 => $y }); my $ar = PublicInbox::AutoReap->new($pid); - diag "$arg[-1] running pid=$pid"; + diag "$cmd[-1] running pid=$pid"; close $y; my $r = $doreq->($s, qw(test_inspect -d), $ibx_idx[0]); my %info = map { split(/=/, $_, 2) } split(/ /, do { local $/; <$r> }); @@ -141,24 +141,20 @@ my $test = sub { my @NO_CXX = (1); unless ($ENV{TEST_XH_CXX_ONLY}) { - my $ar = $test->(qw[-MPublicInbox::XapHelper -e + my $ar = $test->($^X, qw[-w -MPublicInbox::XapHelper -e PublicInbox::XapHelper::start('-j0')]); - ($ar, my $s) = $test->(qw[-MPublicInbox::XapHelper -e + ($ar, my $s) = $test->($^X, qw[-w -MPublicInbox::XapHelper -e PublicInbox::XapHelper::start('-j1')]); no_pollerfd($ar->{pid}); } SKIP: { - eval { - require PublicInbox::XapHelperCxx; - PublicInbox::XapHelperCxx::check_build(); - }; + require PublicInbox::XapHelperCxx; + my $cmd = eval { PublicInbox::XapHelperCxx::cmd() }; skip "XapHelperCxx build: $@", 1 if $@ || $ENV{PI_NO_CXX}; @NO_CXX = $ENV{TEST_XH_CXX_ONLY} ? (0) : (0, 1); - my $ar = $test->(qw[-MPublicInbox::XapHelperCxx -e - PublicInbox::XapHelperCxx::start('-j0')]); - $ar = $test->(qw[-MPublicInbox::XapHelperCxx -e - PublicInbox::XapHelperCxx::start('-j1')]); + my $ar = $test->(@$cmd, '-j0'); + $ar = $test->(@$cmd, '-j1'); }; require PublicInbox::CodeSearch;