Restart IO operations when interrupter by signal
authorRoland Schulz <roland@utk.edu>
Wed, 11 Apr 2012 15:39:02 +0000 (11:39 -0400)
committerRoland Schulz <roland@utk.edu>
Mon, 16 Apr 2012 13:22:18 +0000 (09:22 -0400)
Fixes #798

Change-Id: I762412abf8138bbbe3d386d015e6af3522bd5235

CMakeLists.txt
src/gmxlib/sighandler.c

index a9fef964bab3cf7be98073550c4c66a95572cc03..77cbe0dcf3053587d1a453a74314e97ef07d3c1e 100644 (file)
@@ -301,6 +301,7 @@ check_function_exists(fsync             HAVE_FSYNC)
 check_function_exists(_fileno           HAVE__FILENO)
 check_function_exists(fileno            HAVE_FILENO)
 check_function_exists(_commit           HAVE__COMMIT)
+check_function_exists(sigaction         HAVE_SIGACTION)
 
 include(CheckLibraryExists)
 check_library_exists(m sqrt "" HAVE_LIBM)
index 178f5c87bc37eb91c658fdf058d98d2ac9545a04..71115b7478dfd6eaf2b6d7a692e904b9b959abae 100644 (file)
@@ -97,6 +97,17 @@ static void signal_handler(int n)
     }
 }
 
+static void gmx_signal(int signum) 
+{
+#ifdef HAVE_SIGACTION
+    struct sigaction act;
+    act.sa_handler = signal_handler;
+    act.flags = SA_RESTART;
+    sigaction(signum,act);
+#else
+    signal(signum,signal_handler);
+#endif
+}
 
 void signal_handler_install(void)
 {
@@ -106,7 +117,7 @@ void signal_handler_install(void)
         {
             fprintf(debug,"Installing signal handler for SIGTERM\n");
         }
-        signal(SIGTERM,signal_handler);
+        gmx_signal(SIGTERM);
     }
     if (getenv("GMX_NO_INT") == NULL)
     {
@@ -114,7 +125,7 @@ void signal_handler_install(void)
         {
             fprintf(debug,"Installing signal handler for SIGINT\n");
         }
-        signal(SIGINT,signal_handler);
+        gmx_signal(SIGINT);
     }
 #ifdef HAVE_SIGUSR1
     if (getenv("GMX_NO_USR1") == NULL)
@@ -123,7 +134,7 @@ void signal_handler_install(void)
         {
             fprintf(debug,"Installing signal handler for SIGUSR1\n");
         }
-        signal(SIGUSR1,signal_handler);
+        gmx_signal(SIGUSR1);
     }
 #endif
 }