parallel: Call _exit so that C and OCaml exit handlers don't run.
authorRichard W.M. Jones <rjones@redhat.com>
Mon, 23 Mar 2015 22:24:37 +0000 (22:24 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 23 Mar 2015 22:28:27 +0000 (22:28 +0000)
Makefile.am
exit.c [moved from empty.c with 58% similarity]
parallel.ml

index a7f9d66..4072a66 100644 (file)
@@ -70,10 +70,8 @@ BEST     = ocamlopt
 endif
 
 bin_PROGRAMS = mclu
-# Since there are no real C sources (at least, not yet) we have a
-# token C file that is empty, just to keep automake happy.  The real
-# sources are *.ml files.
-mclu_SOURCES = empty.c
+mclu_SOURCES = exit.c
+mclu_CPPFLAGS = -I$(OCAMLLIB)
 mclu_DEPENDENCIES = $(OBJECTS)
 mclu_LINK = \
        ./link.sh \
diff --git a/empty.c b/exit.c
similarity index 58%
rename from empty.c
rename to exit.c
index 25ce68f..b5817ef 100644 (file)
--- a/empty.c
+++ b/exit.c
@@ -1,5 +1,7 @@
 /* mclu: Mini Cloud
  * Copyright (C) 2014-2015 Red Hat Inc.
+ * Derived from: virt-v2v
+ * Copyright (C) 2009-2015 Red Hat Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * 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
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-/* intentionally empty */
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <caml/mlvalues.h>
+
+extern int parallel_exit (value rv) __attribute__((noreturn));
+
+int
+parallel_exit (value rv)
+{
+  _exit (Int_val (rv));
+}
index 086611e..1bb9897 100644 (file)
@@ -21,6 +21,9 @@
 open Printf
 open Unix
 
+(* Call _exit directly, ie. do not run OCaml atexit handlers. *)
+external _exit : int -> 'a = "parallel_exit" "noalloc"
+
 let map f xs =
   let xs = List.map (
     fun x ->
@@ -35,8 +38,10 @@ let map f xs =
         close rfd;
         let y = Printexc.catch f x in
         (* Write the final value to the pipe. *)
-        output_value (out_channel_of_descr wfd) y;
-        exit 0
+        let chan = out_channel_of_descr wfd in
+        output_value chan y;
+        flush chan;
+        _exit 0
 
       | pid ->                          (* parent *)
         close wfd;