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 C9B011F677 for ; Mon, 13 Nov 2023 13:15:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1699881353; bh=V6XioSzw6gCnoXqVP1p2iI5PVtzJL1ukary3acamVT8=; h=From:To:Subject:Date:In-Reply-To:References:From; b=z1IvU6ZP+G9G2fal7eygovwEUS8aw5Q80yR5j8ZzEUxS7pTgqyEIV7VwFszUSUqI4 XnhufjawZ1f/F0ermh7unWlv0qiE2YpZnNOyiFQq5YhvGFTd7jD9OpKOPqNqIo3f5f lkpuzeDPini/wJthVAqv+KqC4H6Q1LuIhr7hCt14= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 07/18] xap_client: spawn C++ xap_helper directly Date: Mon, 13 Nov 2023 13:15:40 +0000 Message-Id: <20231113131551.843230-8-e@80x24.org> In-Reply-To: <20231113131551.843230-1-e@80x24.org> References: <20231113131551.843230-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: No need to suffer through an extra dose of slow Perl load times when we can drive the build in the big 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 3afdd69e..e516b111 100644 --- a/lib/PublicInbox/XapHelperCxx.pm +++ b/lib/PublicInbox/XapHelperCxx.pm @@ -114,17 +114,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;