Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Remove Lazy from native and bytecode modes: not thread safe
Angstrom (and as a consequence Uri.of_string) is not thread-safe. On OCaml 4 this actually leads to a SIGSEGV sometimes, on OCaml 5 it raises CamlinternalLazy.Undefined. This could be fixed by adding a 'Lazy.force p |> ignore' so that the Lazy value is never observable from a concurrent/parallel context, but I prefer to remove Lazy completely, at least until the reason for the OCaml 4 segfault is understood. Using a ref here is safe, because the ref is only changed once before 'fix_direct' returns, so it is never changed from a concurrent/parallel context. And it still preserves the optimization that Lazy did: the fixpoint is only computed once. This avoids the crash noticed in mirage/ocaml-uri#178 Use @gasche's suggestion to avoid an option by storing a function that would raise initially (this function never gets invoked, because the ref is immediately updated) Signed-off-by: Edwin Török <[email protected]>
- Loading branch information