# Multicore OCaml: June 2021

**URL:** <https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134>\
**Category:** Community\
**Tags:** multicore, multicore-monthly\
**Created:** [July 12, 2021, 3:41pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134 "2021-07-12T15:41:19Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![avsm](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/avsm/32/6_2.png) [@avsm](https://discuss.ocaml.org/u/avsm)\
**Post date:** [July 12, 2021, 3:41pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/1 "2021-07-12T15:41:19Z")

</div>

Welcome to the June 2021 [Multicore OCaml](https://github.com/ocaml-multicore/ocaml-multicore) monthly report! This month’s update along with the [previous update’s](https://discuss.ocaml.org/tag/multicore-monthly) have been compiled by @avsm, @ctk21, @kayceesrk and @shakthimaan.

Our overall goal remains on track for generating a preview tree for OCaml 5.0 multicore domains-only parallelism over the summer.

## Ecosystem compatibility for 4.12.0+domains

In [May’s update](https://discuss.ocaml.org/t/multicore-ocaml-may-2021/7990#ecosystem-changes-to-prepare-for-500-domains-only-2), I noted that our focus was now on adapting the ecosystem to work well with multicore, and I’m pleased to report that this is progressing very well.

- The 4.12.0+domains multicore compiler variant has been [merged into mainline opam-repo](https://github.com/ocaml/opam-repository/pull/18960), so you can now `opam switch 4.12.0+domains` directly. The `base-domains` package is also available to mark your opam project as _requiring_ the `Domains` module, so you can even publish your early multicore-capable libraries to the mainline opam repository now.

- The OCaml standard library was made safe for parallel use by multiple domains ([wiki](https://github.com/ocaml-multicore/ocaml-multicore/wiki/Safety-of-Stdlib-under-Multicore-OCaml), [issue](https://github.com/ocaml/ocaml/issues/10453), [fixes](https://github.com/ocaml-multicore/ocaml-multicore/issues?q=is%3Aissue+label%3A%22stdlib+safety%22+is%3Aclosed)); and in particularly the `Format` and `Random` modules. These modules were the main sources of incompatibilities we found when running existing OCaml code with multiple domains.

- The `Domain` module has had its interface slimmed with the removal of `critical_section`, `wait`, `notify` which has allowed significant runtime simplification. The GC C-API interface is now implemented and this means that Jane Street’s `Base`, `Core`, and `Async` now compile on `4.12+domains` without modifications; for example `opam install patdiff` works out of the box on a `4.12+domains` switch!

- [Domainslib 0.3.0](https://github.com/ocaml-multicore/domainslib/releases/tag/0.3.0) has been released which incorporates multiple improvements including the work-stealing deques for task distribution. The performance of reading domain local variables has also been improved with a primitive and a O(1) lookup. The chapter on [`Parallel Programming in Multicore OCaml`](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml) has been updated to reflect the latest developments with Domainslib.

This means that big application stacks should now compile pretty well with 4.12.0+domains (applications like the Tezos node and patdiff exercise a lot of the dependency trees in opam). If you do find incompatibilities, please do report them on the [repository](https://github.com/ocaml-multicore/ocaml-multicore/issues).

## 4.12.0+domains+effects

Most of our focus has been on getting the domains-only trees (for OCaml 5.0) up to speed, but we have been progressing the direct-style effects-based IO stack as well.

- The `uring` bindings to Linux Io\_uring are now available on opam-repository, so you can try it out on sequential OCaml too. A good mini-project would be to add a uring backend to the existing Async or Lwt engines, if anyone wants to try a substantial contribution.
- The [`eio` library](https://github.com/ocaml-multicore/eio) is fairly usable now, for both filesystem and networking. We’ve submitted a talk to the OCaml workshop to dive into the innards of it in more detail, so stay tuned for that in the coming months if accepted. The main changes here have been performance improvements, and the HTTP stack is fairy competitive with (e.g.) `rust-hyper`.

We will soon also have a variant of this tree that removes the custom effect syntax and implements the fibres (the runtime piece) as `Obj` functions. This will further improve ecosystem compatibility and allow us to build direct-style OCaml libraries that use fibres internally to provide concurrency, but without exposing any use of effects in their interfaces.

## Benchmarking and performance

We are always keen to get more benchmarks that exercise multicore features; if you want to try multicore out and help write benchmarks there are some suggestions on the [wiki](https://github.com/ocaml-multicore/ocaml-multicore/wiki/Multicore-benchmarking-projects). We’ve got a private server which runs a Sandmark nightly benchmark pipeline with Jupyter notebooks, which we can give access to anyone who submits benchmarks. We continue to test integration of Sandmark with [current-bench](https://github.com/ocurrent/current-bench) for better integration with GitHub PRs.

As always, the Multicore OCaml ongoing and completed tasks are listed first, which are then followed by updates from the ecosystem and their associated libraries. The Sandmark benchmarking and nightly build efforts are then mentioned. Finally, the status of the upstream OCaml Safepoints PR is provided for your reference.

## Multicore OCaml

### Ongoing

- [ocaml-multicore/ocaml-multicore#573](https://github.com/ocaml-multicore/ocaml-multicore/pull/573)  
Backport trunk safepoints PR to multicore

- [ocaml-multicore/ocaml-multicore#584](https://github.com/ocaml-multicore/ocaml-multicore/pull/584)  
Modernise signal handling

- [ocaml-multicore/ocaml-multicore#598](https://github.com/ocaml-multicore/ocaml-multicore/pull/598)  
Do not deliver signals to threads that have blocked them

- [ocaml-multicore/ocaml-multicore#600](https://github.com/ocaml-multicore/ocaml-multicore/pull/600)  
Expose a few more GC variables in headers

- [ocaml-multicore/ocaml-multicore#601](https://github.com/ocaml-multicore/ocaml-multicore/pull/601)  
Domain better participants

- [ocaml-multicore/ocaml-multicore#603](https://github.com/ocaml-multicore/ocaml-multicore/pull/603)  
Systhreads tick thread

### Completed

#### Enhancements

- [ocaml-multicore/ocaml-multicore#552](https://github.com/ocaml-multicore/ocaml-multicore/pull/552)  
Add a `force_instrumented_runtime` option to configure

- [ocaml-multicore/ocaml-multicore#558](https://github.com/ocaml-multicore/ocaml-multicore/pull/558)  
Refactor `Domain.{spawn/join}` to use no critical sections

- [ocaml-multicore/ocaml-multicore#561](https://github.com/ocaml-multicore/ocaml-multicore/pull/561)  
Slim down `Domain.Sync`: remove `wait`, `notify`, `critical_section`

- [ocaml-multicore/ocaml-multicore#576](https://github.com/ocaml-multicore/ocaml-multicore/pull/576)  
Including Git hash in runtime

- [ocaml-multicore/ocaml-multicore#579](https://github.com/ocaml-multicore/ocaml-multicore/pull/579)  
Primitive for fetching DLS root

#### Upstream

- [ocaml-multicore/ocaml-multicore#555](https://github.com/ocaml-multicore/ocaml-multicore/pull/555)  
runtime: `CAML_TRACE_VERSION` is now set to a Multicore specific value

- [ocaml-multicore/ocaml-multicore#581](https://github.com/ocaml-multicore/ocaml-multicore/pull/581)  
Move our usage of inline to `Caml_inline`

- [ocaml-multicore/ocaml-multicore#589](https://github.com/ocaml-multicore/ocaml-multicore/pull/589)  
Reintroduce `adjust_gc_speed`

- [ocaml-multicore/ocaml-multicore#590](https://github.com/ocaml-multicore/ocaml-multicore/pull/590)  
runtime: stub `caml_stat_*` interfaces in gc\_ctrl

#### Fixes

- [ocaml-multicore/ocaml-multicore#562](https://github.com/ocaml-multicore/ocaml-multicore/pull/562)  
Import fixes to the minor heap allocation code from DLABs

- [ocaml-multicore/ocaml-multicore#593](https://github.com/ocaml-multicore/ocaml-multicore/pull/593)  
Fix two issues with ephemerons

- [ocaml-multicore/ocaml-multicore#594](https://github.com/ocaml-multicore/ocaml-multicore/pull/594)  
Fix finaliser handover issue

- [ocaml-multicore/ocaml-multicore#596](https://github.com/ocaml-multicore/ocaml-multicore/pull/596)  
systhreads: do `st_thread_id` after initializing the thread descriptor

- [ocaml-multicore/ocaml-multicore#604](https://github.com/ocaml-multicore/ocaml-multicore/pull/604)  
Fix unguarded `caml_skiplist_empty` in `caml_scan_global_young_roots`

#### Cleanups

- [ocaml-multicore/ocaml-multicore#567](https://github.com/ocaml-multicore/ocaml-multicore/pull/567)  
Simplify some of the minor\_gc code

- [ocaml-multicore/ocaml-multicore#580](https://github.com/ocaml-multicore/ocaml-multicore/pull/580)  
Remove struct domain

- [ocaml-multicore/ocaml-multicore#583](https://github.com/ocaml-multicore/ocaml-multicore/pull/583)  
Removing interrupt queues

#### Sundries

- [ocaml-multicore/ocaml-multicore#582](https://github.com/ocaml-multicore/ocaml-multicore/pull/582)  
Make global state domain-local in Random, Hashtbl and Filename

- [ocaml-multicore/ocaml-multicore#586](https://github.com/ocaml-multicore/ocaml-multicore/pull/586)  
Make the state in Format domain-local

- [ocaml-multicore/ocaml-multicore#595](https://github.com/ocaml-multicore/ocaml-multicore/pull/595)  
Implement `caml_alloc_dependent_memory` and `caml_free_dependent_memory`

## Ecosystem

### Ongoing

- [ocaml-multicore/eventlog-tools#3](https://github.com/ocaml-multicore/eventlog-tools/pull/3)  
Use ocaml/setup-ocaml@v2

- [ocaml-multicore/parallel-programming-in-multicore-ocaml#7](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml/pull/7)  
Add a section on Domain-Local Storage

- [ocaml-multicore/eio#26](https://github.com/ocaml-multicore/eio/pull/26)  
Grand Central Dispatch Backend

- [ocaml-multicore/domainslib#34](https://github.com/ocaml-multicore/domainslib/pull/34)  
Fix initial value accounting in `parallel_for_reduce`

- [ocaml-multicore/domainslib#36](https://github.com/ocaml-multicore/domainslib/pull/36)  
Switch to default `Random` module

 ![Domainslib-PR-36-Results](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/9/9a68704f282ac07167fb7d909334befa437593f0.png)

- [ocaml-multicore/multicore-opam#56](https://github.com/ocaml-multicore/multicore-opam/issues/56)  
Base-effects depends strictly on 4.12

- [ocsigen/lwt#860](https://github.com/ocsigen/lwt/pull/860)  
Lwt\_domain: An interfacet to Multicore parallelism

### Completed

#### Ocaml-Uring

The `ocaml-uring` repository contains bindings to `io_uring` for  
OCaml.

- [ocaml-multicore/ocaml-uring#21](https://github.com/ocaml-multicore/ocaml-uring/pull/21)  
Add accept call

- [ocaml-multicore/ocaml-uring#22](https://github.com/ocaml-multicore/ocaml-uring/pull/22)  
Add support for cancellation

- [ocaml-multicore/ocaml-uring#24](https://github.com/ocaml-multicore/ocaml-uring/pull/24)  
Sort out cast

- [ocaml-multicore/ocaml-uring#25](https://github.com/ocaml-multicore/ocaml-uring/pull/25)  
Fix test\_cancel

- [ocaml-multicore/ocaml-uring#26](https://github.com/ocaml-multicore/ocaml-uring/pull/26)  
Add `openat2`

- [ocaml-multicore/ocaml-uring#27](https://github.com/ocaml-multicore/ocaml-uring/pull/27)  
Fine-tune C flags for better performance

- [ocaml-multicore/ocaml-uring#28](https://github.com/ocaml-multicore/ocaml-uring/pull/28)  
Don’t allow freeing the ring while it is in use

- [ocaml-multicore/ocaml-uring#29](https://github.com/ocaml-multicore/ocaml-uring/pull/29)  
Replace iovec with cstruct and clean up the C stubs

- [ocaml-multicore/ocaml-uring#30](https://github.com/ocaml-multicore/ocaml-uring/pull/30)  
Fix remaining TODOs in API

- [ocaml-multicore/ocaml-uring#31](https://github.com/ocaml-multicore/ocaml-uring/pull/31)  
Use `caml_enter_blocking_section` when waiting

- [ocaml-multicore/ocaml-uring#32](https://github.com/ocaml-multicore/ocaml-uring/pull/32)  
Compile `uring` using the C flags from OCaml

- [ocaml-multicore/ocaml-uring#33](https://github.com/ocaml-multicore/ocaml-uring/pull/33)  
Prepare release

- [ocaml-multicore/ocaml-uring#34](https://github.com/ocaml-multicore/ocaml-uring/pull/34)  
Convert `liburing` to subtree

#### Parallel Programming in Multicore OCaml

- [ocaml-multicore/parallel-programming-in-multicore-ocaml#5](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml/pull/5)  
`num_domains` to `num_additional_domains`

- [ocaml-multicore/parallel-programming-in-multicore-ocaml#6](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml/pull/6)  
Update latest information about compiler versions

- [ocaml-multicore/parallel-programming-in-multicore-ocaml#8](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml/pull/8)  
Nudge people to the default chunk\_size setting

- [ocaml-multicore/parallel-programming-in-multicore-ocaml#9](https://github.com/ocaml-multicore/parallel-programming-in-multicore-ocaml/pull/9)  
Eventlog section updates

#### Eio

The `eio` library provides an effects-based parallel IO stack for  
Multicore OCaml.

##### Additions

- [ocaml-multicore/eio#41](https://github.com/ocaml-multicore/eio/pull/41)  
Add eio.mli file

- [ocaml-multicore/eio#45](https://github.com/ocaml-multicore/eio/pull/45)  
Add basic domain manager

- [ocaml-multicore/eio#46](https://github.com/ocaml-multicore/eio/pull/46)  
Add Eio.Time and allow cancelling sleeps

- [ocaml-multicore/eio#53](https://github.com/ocaml-multicore/eio/pull/53)  
Add `Switch.sub_opt`

- [ocaml-multicore/eio#54](https://github.com/ocaml-multicore/eio/pull/54)  
Initial FS abstraction

- [ocaml-multicore/eio#56](https://github.com/ocaml-multicore/eio/pull/56)  
Add `with_open_in`, `with_open_out` and `with_open_dir` helpers

- [ocaml-multicore/eio#58](https://github.com/ocaml-multicore/eio/pull/58)  
Add `Eio_linux.{readv, writev}`

- [ocaml-multicore/eio#59](https://github.com/ocaml-multicore/eio/pull/59)  
Add `Eio_linux.noop` and a simple benchmark

- [ocaml-multicore/eio#61](https://github.com/ocaml-multicore/eio/pull/61)  
Add generic Enter effect to simplify scheduler

 ![Eio-PR-61-Benchmark](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/3/3c1b2df002e1f57be2850d8b81d5eb08afb097dd.png)

##### Improvements

- [ocaml-multicore/eio#38](https://github.com/ocaml-multicore/eio/pull/38)  
Rename Flow.write to Flow.copy

- [ocaml-multicore/eio#36](https://github.com/ocaml-multicore/eio/pull/36)  
Use uring for accept

- [ocaml-multicore/eio#37](https://github.com/ocaml-multicore/eio/pull/37)  
Performance improvements

- [ocaml-multicore/eio#48](https://github.com/ocaml-multicore/eio/pull/48)  
Simplify `Suspend` operation

- [ocaml-multicore/eio#52](https://github.com/ocaml-multicore/eio/pull/52)  
Split Linux support out to `eio_linux` library

- [ocaml-multicore/eio#57](https://github.com/ocaml-multicore/eio/pull/57)  
Reraise exceptions with backtraces

- [ocaml-multicore/eio#60](https://github.com/ocaml-multicore/eio/pull/60)  
Simplify handling of completions

##### Cleanups

- [ocaml-multicore/eio#42](https://github.com/ocaml-multicore/eio/pull/42)  
Merge fibreslib into eio

- [ocaml-multicore/eio#47](https://github.com/ocaml-multicore/eio/pull/47)  
Clean up the network API

- [ocaml-multicore/eio#49](https://github.com/ocaml-multicore/eio/pull/49)  
Remove `Eio.Private.Waiters` and `Eio.Private.Switch`

- [ocaml-multicore/eio#55](https://github.com/ocaml-multicore/eio/pull/55)  
Some API and README cleanups

##### Documentation

- [ocaml-multicore/eio#43](https://github.com/ocaml-multicore/eio/pull/43)  
Add design note about determinism

- [ocaml-multicore/eio#50](https://github.com/ocaml-multicore/eio/pull/50)  
README improvements

#### Handling Cancellation

- [ocaml-multicore/eio#39](https://github.com/ocaml-multicore/eio/pull/39)  
Allow cancelling accept operations

- [ocaml-multicore/eio#40](https://github.com/ocaml-multicore/eio/pull/40)  
Support cancelling the remaining Uring operations

- [ocaml-multicore/eio#44](https://github.com/ocaml-multicore/eio/pull/44)  
Fix read-cancel test

- [ocaml-multicore/eio#51](https://github.com/ocaml-multicore/eio/pull/51)  
Getting `EALREADY` from cancel is not an error

#### Sundries

- [ocaml-multicore/eventlog-tools#2](https://github.com/ocaml-multicore/eventlog-tools/pull/2)  
Add a pausetimes tool

- [ocaml-multicore/kcas#9](https://github.com/ocaml-multicore/kcas/pull/9)  
Backoff with `cpu_relax`

- [ocaml-multicore/retro-httpaf-bench#10](https://github.com/ocaml-multicore/retro-httpaf-bench/pull/10)  
Add Eio benchmark

- [ocaml-multicore/retro-httpaf-bench#11](https://github.com/ocaml-multicore/retro-httpaf-bench/pull/11)  
Do a recursive checkout in the CI build

- [domainslib#29](https://github.com/ocaml-multicore/domainslib/pull/29)  
Task stealing with Chase Lev deques

- [ocaml-multicore/multicore-opam#55](https://github.com/ocaml-multicore/multicore-opam/pull/55)  
Add 0.3.0 release of domainslib

## Benchmarking

### Ongoing

- [ocaml-bench/sandmark-nightly#1](https://github.com/ocaml-bench/sandmark-nightly/issues/1)  
Cannot alter comparison input values

 ![Sandmark-Nightly-1-Issue](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/e/e029e7d420487a4f3f63893dd4412322c1933787.png)

- [ocaml-bench/sandmark#230](https://github.com/ocaml-bench/sandmark/pull/230)  
Build for 4.13.0+trunk with dune.2.8.1

- [ocaml-bench/sandmark#231](https://github.com/ocaml-bench/sandmark/issues/231)  
View results for a set of benchmarks in the nightly notebooks

- [ocaml-bench/sandmark#233](https://github.com/ocaml-bench/sandmark/pull/233)  
Update pausetimes\_multicore to fit with the latest Multicore changes

 ![Sandmark-PR-233-Serial-Pausetimes](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/9/9aa420116b999df5b89cd106b211673b3d2afb1d.png)  
 ![Sandmark-PR-233-Parallel-Pausetimes](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/c/cc380d59494290056577f76f977b0ffcb4199e55.png)

- [ocaml-bench/sandmark#235](https://github.com/ocaml-bench/sandmark/issues/235)  
Update selected benchmarks as a set for baseline benchmark

![Sandmark-Issue-235](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/f/fba96b8d43ee766bff262ec5ca0c48e356e8d9cb.png)

- [ocaml-bench/sandmark#236](https://github.com/ocaml-bench/sandmark/issues/236)  
Implement pausetimes support in sandmark\_nightly

- [ocaml-bench/sandmark#237](https://github.com/ocaml-bench/sandmark/issues/237)  
Run sandmark\_nightly on a larger machine

- [ocaml-bench/sandmark#241](https://github.com/ocaml-bench/sandmark/pull/241)  
Switch to default Random module

### Completed

- [ocaml-bench/sandmark#232](https://github.com/ocaml-bench/sandmark/pull/232)  
`num_domains` → `num_additional_domains`

- [ocaml-bench/sandmark#239](https://github.com/ocaml-bench/sandmark/pull/239)  
Port grammatrix to Task pool

 ![Sandmark-PR-239-Time](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/d/d1e2d18707d543bc73cfa967c7dbfc2dd4783416.png)  
 ![Sandmark-PR-239-Speedup](https://us1.discourse-cdn.com/flex020/uploads/ocaml/original/2X/4/4b920039c0ebf9b1fbac4597b08ecf40f6e0f14f.png)

## OCaml

### Ongoing

- [ocaml/ocaml#10039](https://github.com/ocaml/ocaml/pull/10039)  
Safepoints

Our thanks to all the OCaml users, developers and contributors in the community for their continued support to the project. Stay safe!

---

<div class="post-metadata">

**Author:** ![cvine](https://avatars.discourse-cdn.com/v4/letter/c/90db22/32.png) [@cvine](https://discuss.ocaml.org/u/cvine)\
**Post date:** [July 13, 2021, 12:17am UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/2 "2021-07-13T00:17:44Z")

</div>

> [@avsm](#):
>
> The OCaml standard library was made safe for parallel use by multiple domains ([wiki](https://github.com/ocaml-multicore/ocaml-multicore/wiki/Safety-of-Stdlib-under-Multicore-OCaml), [issue](https://github.com/ocaml/ocaml/issues/10453), [fixes](https://github.com/ocaml-multicore/ocaml-multicore/issues?q=is%3Aissue+label%3A%22stdlib+safety%22+is%3Aclosed)); and in particularly the `Format` and `Random` modules.

As a point of information, does that include the Str module, which seems obviously unsafe unless its stored state is thread local? (I am not making a special case for Str, as Re already provides a more capable alternative.)

---

<div class="post-metadata">

**Author:** ![Kakadu](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/kakadu/32/1204_2.png) [@Kakadu](https://discuss.ocaml.org/u/Kakadu)\
**Post date:** [July 16, 2021, 1:15pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/3 "2021-07-16T13:15:21Z")

</div>

Does effect-based stdlib got into opam? Fancy arrows like `-[async]->` from Leo’s [talk](https://www.janestreet.com/tech-talks/effective-programming/)? I looked at 4.12.0+domains+effects opam switch and looks like it is not what I need.

---

<div class="post-metadata">

**Author:** ![avsm](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/avsm/32/6_2.png) [@avsm](https://discuss.ocaml.org/u/avsm)\
**Post date:** [August 2, 2021, 1:24pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/4 "2021-08-02T13:24:12Z")

</div>

> [@cvine](#):
>
> As a point of information, does that include the Str module, which seems obviously unsafe unless its stored state is thread local? (I am not making a special case for Str, as Re already provides a more capable alternative.)

It doesn’t, but we do need to figure out the story for Str. I’ve created a new issue for it here: [Str module multi domain safety · Issue #632 · ocaml-multicore/ocaml-multicore · GitHub](https://github.com/ocaml-multicore/ocaml-multicore/issues/632)

(and please do feel free to create such issues for any other Stdlib modules that you run across)

---

<div class="post-metadata">

**Author:** ![avsm](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/avsm/32/6_2.png) [@avsm](https://discuss.ocaml.org/u/avsm)\
**Post date:** [August 2, 2021, 1:26pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/5 "2021-08-02T13:26:08Z")

</div>

> [@Kakadu](#):
>
> Does effect-based stdlib got into opam? Fancy arrows like `-[async]->` from Leo’s [talk](https://www.janestreet.com/tech-talks/effective-programming/)? I looked at 4.12.0+domains+effects opam switch and looks like it is not what I need.

No, the “ecaml” work from Leo is something we’re working on to place _over_ the runtime fibre support (the “untyped effects”) that are currently in 4.12.0+domains+effects. No timescales we can share for that yet, but at a minimum it’ll arrive after runtime fibre support is upstreamed to a future OCaml, which itself won’t happen until domains support arrives – so please focus your attention on Domains support! 🙂 .

---

<div class="post-metadata">

**Author:** ![Kakadu](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/kakadu/32/1204_2.png) [@Kakadu](https://discuss.ocaml.org/u/Kakadu)\
**Post date:** [August 2, 2021, 3:12pm UTC](https://discuss.ocaml.org/t/multicore-ocaml-june-2021/8134/6 "2021-08-02T15:12:45Z")

</div>

@avsm, Maybe you at least have a branch of OCaml where I can play with ‘ecaml’ a little bit?
