aboutsummaryrefslogtreecommitdiff
path: root/src/rdf.cc
diff options
context:
space:
mode:
authortradke <tradke@83718e91-0e4f-0410-abf4-91180603181f>2006-07-27 14:31:18 +0000
committertradke <tradke@83718e91-0e4f-0410-abf4-91180603181f>2006-07-27 14:31:18 +0000
commit4ca4d073b66b77072a19d8a72b021c30792793c6 (patch)
tree32b2d8e1efa68f31366cf1fdceba288a6450b99a /src/rdf.cc
parent4a4304aa65d4aa2b92700aa90c10e99ed75e8a3a (diff)
Use POSIX::sigaction for setting the SIGALRM handler to bypass the Perl
interpreter's signal handling which uses defered signals effectively ignoring user-defined timeouts for some I/O functions (see 'man perlipc' and then grep for 'Interrupting IO'). Check whether system ('perl script') exited due to SIGINT and, if so, raise(3) that signal also in the simulation process in order to stop it. git-svn-id: http://svn.cactuscode.org/arrangements/CactusUtils/Formaline/trunk@102 83718e91-0e4f-0410-abf4-91180603181f
Diffstat (limited to 'src/rdf.cc')
-rw-r--r--src/rdf.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/rdf.cc b/src/rdf.cc
index 570cb1a..126ecb5 100644
--- a/src/rdf.cc
+++ b/src/rdf.cc
@@ -13,6 +13,7 @@
#include <list>
#include <string>
#include <sstream>
+#include <signal.h>
#include <unistd.h>
@@ -395,6 +396,7 @@ namespace Formaline
<< endl
<< "use strict;" << endl
<< "use Socket;" << endl
+<< "use POSIX;" << endl
<< endl
<< "my $input = '" << datafilename << "';" << endl
<< "my @hostlist = (";
@@ -420,7 +422,18 @@ namespace Formaline
<< endl
<< " # set a timeout for the entire interaction with this server" << endl
<< " eval {" << endl
+//
+// use POSIX::sigaction to bypass the Perl interpreter's signal handling
+// which uses defered signals effectively ignoring user-defined timeouts
+// for some I/O functions
+// (see 'man perlipc' and then grep for 'Interrupting IO')
+//
+#if 1
+<< " POSIX::sigaction (SIGALRM, POSIX::SigAction->new (sub { die 'timeout' }))" << endl
+<< " or die \"Error setting SIGALRM handler: $!\";" << endl
+#else
<< " local $SIG{ALRM} = sub { die 'timeout' };" << endl
+#endif
<< " alarm " << timeout << ";" << endl
<< endl
<< " my $iaddr = inet_aton ($host);" << endl
@@ -608,6 +621,12 @@ namespace Formaline
int const ierr = system (cmd);
if (ierr != 0)
{
+ // system(3) blocks SIGINT which otherwise would interrupt the simulation
+ // make sure that this is still so if a user types CTRL-C
+ if (WIFSIGNALED (ierr) and WTERMSIG (ierr) == SIGINT) {
+ raise (SIGINT);
+ }
+
static bool did_complain = false;
if (! did_complain)
{