ocaml/0002-Merge-pull-request-11814-from-gasche-clarify-DLS.new.patch
Richard W.M. Jones 772b17b666 Drop downstream 0017-configure-Only-use-OC_-for-building-executables.patch
This is no longer needed now we found another way to work around build
notes breakage.
2023-07-11 17:46:39 +01:00

67 lines
2.5 KiB
Diff

From 925bf9a6d828d7548751f9a21892cad6209fc950 Mon Sep 17 00:00:00 2001
From: Gabriel Scherer <gabriel.scherer@gmail.com>
Date: Fri, 16 Dec 2022 09:41:13 +0100
Subject: [PATCH 02/17] Merge pull request #11814 from
gasche/clarify-DLS.new_key-doc
clarify the doc of Domain.DLS.new_key
(cherry picked from commit be210179503c4a82b72dd4762560e13c408d37b7)
---
stdlib/domain.mli | 37 ++++++++++++++++++++++++++++++-------
1 file changed, 30 insertions(+), 7 deletions(-)
diff --git a/stdlib/domain.mli b/stdlib/domain.mli
index 7763043aa5..2d79b3b0c3 100644
--- a/stdlib/domain.mli
+++ b/stdlib/domain.mli
@@ -96,15 +96,38 @@ module DLS : sig
val new_key : ?split_from_parent:('a -> 'a) -> (unit -> 'a) -> 'a key
(** [new_key f] returns a new key bound to initialiser [f] for accessing
- domain-local variables.
+, domain-local variables.
- If [split_from_parent] is provided, spawning a domain will derive the
- child value (for this key) from the parent value.
+ If [split_from_parent] is not provided, the value for a new
+ domain will be computed on-demand by the new domain: the first
+ [get] call will call the initializer [f] and store that value.
- Note that the [split_from_parent] call is computed in the parent
- domain, and is always computed regardless of whether the child domain
- will use it. If the splitting function is expensive or requires
- client-side computation, consider using ['a Lazy.t key].
+ If [split_from_parent] is provided, spawning a domain will
+ derive the child value (for this key) from the parent
+ value. This computation happens in the parent domain and it
+ always happens, regardless of whether the child domain will
+ use it.
+ If the splitting function is expensive or requires
+ child-side computation, consider using ['a Lazy.t key]:
+
+ {[
+ let init () = ...
+
+ let split_from_parent parent_value =
+ ... parent-side computation ...;
+ lazy (
+ ... child-side computation ...
+ )
+
+ let key = Domain.DLS.new_key ~split_from_parent init
+
+ let get () = Lazy.force (Domain.DLS.get key)
+ ]}
+
+ In this case a part of the computation happens on the child
+ domain; in particular, it can access [parent_value]
+ concurrently with the parent domain, which may require
+ explicit synchronization to avoid data races.
*)
val get : 'a key -> 'a
--
2.41.0