From 689f49612660745b546017187c8cbdea6bb4fd3e Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 21 Aug 2022 11:19:17 +0100 Subject: [PATCH] prefork-interp: properly handle EINTR in monitor Signed-off-by: Ian Jackson --- pm/Proc/Prefork/Interp.pm | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/pm/Proc/Prefork/Interp.pm b/pm/Proc/Prefork/Interp.pm index 3b38ffa..d1d99ee 100644 --- a/pm/Proc/Prefork/Interp.pm +++ b/pm/Proc/Prefork/Interp.pm @@ -65,11 +65,16 @@ sub become_monitor () { #---- monitor [2] ---- - my $rbits = ''; - vec($rbits, fileno(CALL), 1) = 1; - vec($rbits, fileno(EXECTERM), 1) = 1; - my $ebits = $rbits; - my $nfound = select($rbits, '', $ebits, undef); + for (;;) { + my $rbits = ''; + vec($rbits, fileno(CALL), 1) = 1; + vec($rbits, fileno(EXECTERM), 1) = 1; + my $ebits = $rbits; + my $nfound = select($rbits, '', $ebits, undef); + last if $nfound > 0; + next if $! == EINTR; + fail_log("monitor select() failed: $!"); + } # Either the child has just died, or the caller has gone away -- 2.30.2