package forester

  1. Overview
  2. Docs

Source file LaTeXQueue.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
module T = Domainslib.Task

module type S =
sig
  val enqueue : name:string -> packages:string list -> source:string -> unit
  val process : unit -> unit
end

module Make (I : sig val size : int end) : S =
struct
  let svg_queue : (string, string list * string) Hashtbl.t = Hashtbl.create I.size

  let enqueue ~name ~packages ~source =
    if not @@ Hashtbl.mem svg_queue name then
      Hashtbl.add svg_queue name (packages, source)

  let process () : unit =
    let n = Hashtbl.length svg_queue in
    let tasks = Array.make n `Uninitialized in

    begin
      let i = ref 0 in
      svg_queue |> Hashtbl.iter @@ fun name (packages, source) ->
      tasks.(!i) <- `Task (name, packages, source);
      i := !i + 1
    end;

    Hashtbl.clear svg_queue;

    let worker i =
      match tasks.(i) with
      | `Task (name, packages, source) -> BuildLaTeX.build_latex ~name ~source ~packages
      | `Uninitialized -> failwith "Unexpected uninitialized task in LaTeX queue"
    in

    let pool = T.setup_pool ~num_domains:10 () in
    begin
      T.run pool @@ fun _ ->
      T.parallel_for pool ~start:0 ~finish:(n-1) ~body:worker
    end;
    T.teardown_pool pool;

    Hashtbl.clear svg_queue
end
OCaml

Innovation. Community. Security.