(*
 * Copyright (c) 2017 - present Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *)

open! IStd

(** Pool of processes to execute in parallel up to a number of jobs. *)
type t

exception Execution_error of string(** Infer process execution failure *)

val create : jobs:int -> t
(** Create a new pool of processes *)

val start_child : f:('a -> unit) -> pool:t -> 'a -> unit
(** Start a new child process in the pool.
    If all the jobs are taken, wait until one is free. *)

val wait_all : t -> unit
(** Wait until all the currently executing processes terminate *)

val in_child : bool ref
(** Keep track of whether the current execution is in a child process *)
