diff options
-rw-r--r-- | lib/PublicInbox/XapClient.pm | 28 | ||||
-rw-r--r-- | lib/PublicInbox/XapHelperCxx.pm | 9 | ||||
-rw-r--r-- | 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; |