jon.recoil.org

Module Stdlib.DomainSource

Domains.

See 'Parallel programming' chapter in the manual.

Sourcetype !'a t

A domain of type 'a t runs independently, eventually producing a result of type 'a, or an exception

Sourceval spawn : (unit -> 'a) -> 'a Stdlib.Domain.t

spawn f creates a new domain that runs in parallel with the current domain.

  • raises Failure

    if the program has insufficient resources to create another domain.

  • alert do_not_spawn_domains User programs should never spawn domains. To execute a function on a domain, use [Multicore] from the threading library. This is because spawning more than [recommended_domain_count] domains (the CPU core count) will significantly degrade GC performance.
  • alert unsafe_multidomain Use [Domain.Safe.spawn].
Sourceval join : 'a Stdlib.Domain.t -> 'a @@ portable

join d blocks until domain d runs to completion. If d results in a value, then that is returned by join d. If d raises an uncaught exception, then that is re-raised by join d.

Sourcetype id = private int

Domains have unique integer identifiers

Sourceval get_id : 'a Stdlib.Domain.t -> Stdlib.Domain.id @@ portable

get_id d returns the identifier of the domain d

Sourceval self : unit -> Stdlib.Domain.id @@ portable

self () is the identifier of the currently running domain

Sourceval cpu_relax : unit -> unit @@ portable

If busy-waiting, calling cpu_relax () between iterations will improve performance on some CPU architectures

Sourceval is_main_domain : unit -> bool @@ portable

is_main_domain () returns true if called from the initial domain.

The recommended maximum number of domains which should be running simultaneously (including domains already running).

The value returned is at least 1.

Sourceval self_index : unit -> int @@ portable

The index of the current domain. It is an integer unique among currently-running domains, in the interval 0; N-1 where N is the peak number of domains running simultaneously so far.

The index of a terminated domain may be reused for a new domain. Use (Domain.self () :> int) instead for an identifier unique among all domains ever created by the program.

  • since 5.3
Sourceval before_first_spawn : (unit -> unit) -> unit

before_first_spawn f registers f to be called before the first domain is spawned by the program. The functions registered with before_first_spawn are called on the main (initial) domain. The functions registered with before_first_spawn are called in 'first in, first out' order: the oldest function added with before_first_spawn is called first.

Sourceval at_exit : (unit -> unit) -> unit

at_exit f registers f to be called when the current domain exits. Note that at_exit callbacks are domain-local and only apply to the calling domain. The registered functions are called in 'last in, first out' order: the function most recently added with at_exit is called first. An example:

let temp_file_key = Domain.DLS.new_key (fun _ ->
  let tmp = snd (Filename.open_temp_file "" "") in
  Domain.at_exit (fun () -> close_out_noerr tmp);
  tmp)

The snippet above creates a key that when retrieved for the first time will open a temporary file and register an at_exit callback to close it, thus guaranteeing the descriptor is not leaked in case the current domain exits.

Sourcemodule DLS : sig ... end

Domain-local Storage

Sourcemodule TLS : sig ... end

Thread-local storage. Like DLS, but stores a distinct value for each thread. Domains can contain multiple threads, so TLS should be preferred in nearly all cases.

Sourcemodule Safe : sig ... end

Submodule containing non-backwards-compatible functions which enforce thread safety via modes.