about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/XapClient.pm28
-rw-r--r--lib/PublicInbox/XapHelperCxx.pm9
-rw-r--r--t/xap_helper.t22
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;