chiark / gitweb /
prefork-interp: Perl: new protocol, wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 15 Aug 2022 20:21:30 +0000 (21:21 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 21 Aug 2022 20:21:10 +0000 (21:21 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
perl/Prefork.pm

index bb39265b905f8c04b01dec568df50f3041275888..10c7ec1a70d7b477300285b990ec9b7111136136 100644 (file)
@@ -36,6 +36,10 @@ sub server_quit ($) {
 
 # Returns in the executor process
 sub become_monitor () {
+  close LISTEN;
+  eval { protocol_exchange(); 1; }
+    or fail_log("protocol exchange failed: $@");
+
   my $child = fork // fail_log("fork executor: $!");
   if (!$child) {
     #---- executor ----
@@ -43,6 +47,7 @@ sub become_monitor () {
     open ::STDOUT, ">& $call_fds[1]" or fail_log("dup for fd1");
     open ::STDERR, ">& $call_fds[2]" or fail_log("dup for fd2");
     close_call_fds();
+    $! = 0;
     return;
   }
 
@@ -54,16 +59,8 @@ sub become_monitor () {
   _exit(0);
 }
 
-sub forked_monitor () {
-  close LISTEN;
-  eval { protocol_exchange(); 1; }
-    or fail_log("protocol exchange failed: $@");
-  return become_monitor();
-}
-
 sub close_call_fds () {
   foreach (@call_fds) {
-    next if $_ <= 2;
     POSIX::close($_);
   }
   close CALL;
@@ -93,7 +90,8 @@ sub protocol_read_fail ($) {
 }
 
 sub protocol_exchange () {
-  protocol_write("\n");
+  my $greeting = "PFI\n\0\0\0\0";
+  protocol_write($greeting);
 
   @call_fds = map {
     my $r;
@@ -223,7 +221,7 @@ sub initialisation_complete {
        $child = fork // fail_log("fork for accepted call failed: $!");
        if (!$child) {
          #---- monitor [1] ----
-         forked_monitor();
+         become_monitor();
        }
        close(CALL);
        $errcount = 0;