From 19d10b3161e012a55dede5d82354a197033ed1ae Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 22 Mar 2021 13:19:56 -0500 Subject: [PATCH] netget: watchdog() now returns a result Currently this can only be a scaler value. On timeout, calls the fail function and returns its result instead. --- modules/database/test/std/rec/netget.plt | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/database/test/std/rec/netget.plt b/modules/database/test/std/rec/netget.plt index 075717d78..363625ef2 100644 --- a/modules/database/test/std/rec/netget.plt +++ b/modules/database/test/std/rec/netget.plt @@ -50,11 +50,21 @@ sub kill_bail { } sub watchdog (&$$) { - my ($do, $timeout, $abort) = @_; - $SIG{ALRM} = $abort; - alarm $timeout; - &$do; - alarm 0; + my ($code, $timeout, $fail) = @_; + my $bark = "Woof $$\n"; + my $result; + eval { + local $SIG{__DIE__}; + local $SIG{ALRM} = sub { die $bark }; + alarm $timeout; + $result = &$code; + alarm 0; + }; + if ($@) { + die if $@ ne $bark; + $result = &$fail; + } + return $result; }