chiark / gitweb /
Makefiles: Use Final.sd.mk to implementing RECHECK_RM
[secnet.git] / hackypar.c
index ebab05147206796f748ce387361c472564f24f26..25e41eadd149a42e14202400cf4e2d30de4e2429 100644 (file)
@@ -1,4 +1,22 @@
-/* Hacky parallelism; Ian Jackson */
+/* Hacky parallelism */
+/*
+ * This file is part of secnet.
+ * See README for full list of copyright holders.
+ *
+ * secnet is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * secnet is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * version 3 along with secnet; if not, see
+ * https://www.gnu.org/licenses/gpl.html.
+ */
 
 #define _GNU_SOURCE
 
@@ -24,90 +42,96 @@ typedef enum { hp_idle, hp_compute, hp_deferring, hp_fail } HPState;
 static HPState state;
 static pid_t child;
 
-static void checkchild(void) {
-  int r, status;
+static void checkchild(void)
+{
+    int r, status;
   
-  if (!child) return;
-
-  r= waitpid(child,&status,WNOHANG); if (!r) return;
-  if (r==-1) {
-    Message(M_ERR,"hacky_par: waitpid: %s\n",strerror(errno));
-    return;
-  }
-  child= 0;
+    if (!child) return;
+
+    r= waitpid(child,&status,WNOHANG); if (!r) return;
+    if (r==-1) {
+       Message(M_ERR,"hacky_par: waitpid: %s\n",strerror(errno));
+       return;
+    }
+    child= 0;
   
-  if (WIFSIGNALED(status)) {
-    Message(M_ERR,"hacky_par: signaled! %s\n",strsignal(WTERMSIG(status)));
-  } else if (!WIFEXITED(status)) {
-    Message(M_ERR,"hacky_par: unexpected status! %d\n", r);
-  }
+    if (WIFSIGNALED(status)) {
+       Message(M_ERR,"hacky_par: signaled! %s\n",strsignal(WTERMSIG(status)));
+    } else if (!WIFEXITED(status)) {
+       Message(M_ERR,"hacky_par: unexpected status! %d\n", r);
+    }
 }
 
-static HPState start(void) {
-  assert(!child);
+static HPState start(void)
+{
+    assert(!child);
 
-  child= fork();
-  if (child == -1) {
-    Message(M_ERR,"hacky_par: fork failed: %s\n",strerror(errno));
-    return hp_fail;
-  }
+    child= fork();
+    if (child == -1) {
+       Message(M_ERR,"hacky_par: fork failed: %s\n",strerror(errno));
+       return hp_fail;
+    }
 
-  if (!child) { /* we are the child */
-    return hp_compute;
-  }
+    if (!child) { /* we are the child */
+       afterfork();
+       return hp_compute;
+    }
 
-  Message(M_INFO,"hacky_par: started, punting\n");
-  return hp_deferring;
+    Message(M_INFO,"hacky_par: started, punting\n");
+    return hp_deferring;
 }
 
-int hacky_par_start_failnow(void) {
-  state= hp_idle;
-  checkchild();
-  if (child) {
-    state= hp_deferring;
-    Message(M_INFO,"hacky_par: busy, punting\n");
-    return 1;
-  }
-  return 0;
+int hacky_par_start_failnow(void)
+{
+    state= hp_idle;
+    checkchild();
+    if (child) {
+       state= hp_deferring;
+       Message(M_INFO,"hacky_par: busy, punting\n");
+       return 1;
+    }
+    return 0;
 }
 
-int hacky_par_mid_failnow(void) {
-  state= start();
-  return state != hp_compute;
+int hacky_par_mid_failnow(void)
+{
+    state= start();
+    return state != hp_compute;
 }
 
 bool_t (*packy_par_gen)(struct site *st);
 
 void hacky_par_end(int *ok,
-                  uint32_t retries, uint32_t timeout,
-                  bool_t (*send_msg)(struct site *st), struct site *st) {
-  int i;
+                  int32_t retries, int32_t timeout,
+                  bool_t (*send_msg)(struct site *st), struct site *st)
+{
+    int i;
   
-  switch (state) {
-  case hp_deferring:
-    assert(!*ok);
-    *ok= 1;
-    return;
-  case hp_fail:
-    assert(!*ok);
-    return;
-  case hp_idle:
-    return;
-  case hp_compute:
-    if (!ok) {
-      Message(M_ERR,"hacky_par: compute failed\n");
-      _exit(2);
-    }
-    Message(M_INFO,"hacky_par: got result, sending\n");
-    for (i=1; i<retries; i++) {
-        sleep((timeout + 999)/1000);
-       if (!send_msg(st)) {
-           Message(M_ERR,"hacky_par: retry failed\n");
-           _exit(1);
+    switch (state) {
+    case hp_deferring:
+       assert(!*ok);
+       *ok= 1;
+       return;
+    case hp_fail:
+       assert(!*ok);
+       return;
+    case hp_idle:
+       return;
+    case hp_compute:
+       if (!ok) {
+           Message(M_ERR,"hacky_par: compute failed\n");
+           _exit(2);
+       }
+       Message(M_INFO,"hacky_par: got result, sending\n");
+       for (i=1; i<retries; i++) {
+           sleep((timeout + 999)/1000);
+           if (!send_msg(st)) {
+               Message(M_ERR,"hacky_par: retry failed\n");
+               _exit(1);
+           }
        }
+       _exit(0);
     }
-    _exit(0);
-  }
 }
 
 #else /*!HACKY_PARALLEL*/
@@ -115,7 +139,7 @@ void hacky_par_end(int *ok,
 int hacky_par_start_failnow(void) { return 0; }
 int hacky_par_mid_failnow(void) { return 0; }
 void hacky_par_end(int *ok,
-                  uint32_t retries, uint32_t timeout,
+                  int32_t retries, int32_t timeout,
                   bool_t (*send_msg)(struct site *st), struct site *st) { }
 
 #endif /*HACKY_PARALLEL...else*/