Previously we used an awkward hack to split up the large src/actions.c
into smaller files (which can benefit from being compiled in
parallel). This commit generalizes that code, so that we pass a
subsetted actions list to certain generator functions.
The output of the generator is identical after this commit and the
previous commit, except for the UUID encoded into tests/c-api/tests.c
since that is derived from the MD5 hash of generator/actions.ml.
---
generator/c.ml | 16 +++-------------
generator/c.mli | 4 +---
generator/main.ml | 21 +++++++++++++++------
3 files changed, 19 insertions(+), 22 deletions(-)
diff --git a/generator/c.ml b/generator/c.ml
index 35e08e3..6f5a517 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -33,16 +33,6 @@ let generate_header = generate_header
~inputs:["generator/c.ml"]
(* Generate C API. *)
-(* The actions are split across this many C files. You can increase
- * this number in order to reduce the number of lines in each file
- * (hence making compilation faster), but you also have to modify
- * src/Makefile.am.
- *)
-let nr_actions_files = 7
-let hash_matches h { name = name } =
- let h' = Hashtbl.hash name mod nr_actions_files in
- h = h'
-
type optarg_proto = Dots | VA | Argv
let is_public { visibility = v } = match v with
@@ -1335,7 +1325,7 @@ and generate_client_structs_print_h () =
"
(* Generate the client-side dispatch stubs. *)
-and generate_client_actions hash () =
+and generate_client_actions actions () =
generate_header CStyle LGPLv2plus;
pr "\
@@ -1782,7 +1772,7 @@ and generate_client_actions hash () =
List.iter (
function
| { wrapper = true } as f ->
- if hash_matches hash f then generate_non_daemon_wrapper f
+ generate_non_daemon_wrapper f
| { wrapper = false } ->
() (* no wrapper *)
) (actions |> non_daemon_functions);
@@ -2082,7 +2072,7 @@ and generate_client_actions hash () =
List.iter (
fun f ->
- if hash_matches hash f then generate_daemon_stub f
+ generate_daemon_stub f
) (actions |> daemon_functions)
(* Functions which have optional arguments have two or three
diff --git a/generator/c.mli b/generator/c.mli
index 156b244..8c4e86c 100644
--- a/generator/c.mli
+++ b/generator/c.mli
@@ -22,11 +22,9 @@ val generate_prototype : ?extern:bool -> ?static:bool ->
?semicolon:bool -> ?sin
val generate_c_call_args : ?handle:string -> ?implicit_size_ptr:string ->
?in_daemon:bool -> Types.ret * Types.args * Types.optargs -> unit
-val nr_actions_files : int
-
val generate_actions_pod : unit -> unit
val generate_availability_pod : unit -> unit
-val generate_client_actions : int -> unit -> unit
+val generate_client_actions : Types.action list -> unit -> unit
val generate_client_actions_variants : unit -> unit
val generate_client_structs_cleanup : unit -> unit
val generate_client_structs_compare : unit -> unit
diff --git a/generator/main.ml b/generator/main.ml
index 69c625b..edf106a 100644
--- a/generator/main.ml
+++ b/generator/main.ml
@@ -54,6 +54,20 @@ let perror msg = function
| exn ->
eprintf "%s: %s\n" msg (Printexc.to_string exn)
+(* In some directories the actions are split across this many C
+ * files. You can increase this number in order to reduce the number
+ * of lines in each file (hence making compilation faster), but you
+ * also have to modify .../Makefile.am.
+ *)
+let nr_actions_files = 7
+let actions_subsets =
+ let h i { name = name } = i = Hashtbl.hash name mod nr_actions_files in
+ Array.init nr_actions_files (fun i -> List.filter (h i) actions)
+let output_to_subset fs f =
+ for i = 0 to nr_actions_files-1 do
+ ksprintf (fun filename -> output_to filename (f actions_subsets.(i))) fs i
+ done
+
(* Main program. *)
let () =
let lock_fd =
@@ -103,12 +117,7 @@ Run it from the top source directory using the command
output_to "src/structs-print.c" generate_client_structs_print_c;
output_to "src/structs-print.h" generate_client_structs_print_h;
output_to "src/actions-variants.c" generate_client_actions_variants;
-
- for i = 0 to nr_actions_files-1 do
- let filename = sprintf "src/actions-%d.c" i in
- output_to filename (generate_client_actions i)
- done;
-
+ output_to_subset "src/actions-%d.c" generate_client_actions;
output_to "daemon/actions.h" generate_daemon_actions_h;
output_to "daemon/stubs.c" generate_daemon_actions;
output_to "daemon/names.c" generate_daemon_names;
--
2.9.3