about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/XapClient.pm28
-rw-r--r--lib/PublicInbox/XapHelperCxx.pm9
2 files changed, 18 insertions, 19 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;