Multicore OCaml: March 2022

Multicore OCaml: March 2022

Welcome to the March 2022 Multicore OCaml monthly report! This update along with the previous updates have been compiled by me, @ctk21, @kayceesrk and @shakthimaan.

We have continued steadily towards making a stable OCaml 5.0 release, as you can see from the long list of fixes later – thank you for all your contributions! Platform configurations that were formerly supported in the 4.x branches for OpenBSD, FreeBSD, and NetBSD have now been re-enabled. ARM64 support (for macOS, Linux and the BSDs) is stable in trunk, and ARM CFI integration has been merged as a follow-up to facilitate debugging and profiling. Notably, this also includes memory model tests for ARMv8 and Power ports. The Windows mingw64 port is also working again in trunk.

An effects tutorial has also been contributed to the OCaml manual; feedback continues to be welcome even after it’s merged in. As you experiment with effects, please do continue to post to this forum with questions or comments about your learnings.

The Sandmark benchmark project has added bytecode analysis to address any performance regressions. We have also been working on obtaining measurements for the compilation data points. The current-bench pipeline production deployments has significant UI changes, and now has alert notifications for the benchmark runs.

As always, the Multicore OCaml open and completed tasks are listed first, which are then followed by the ecosystem tooling projects. The Sandmark, sandmark-nightly, and current-bench project updates are finally presented for your reference.

Multicore OCaml



  • ocaml/ocaml#10960
    Audit stdlib for mutable state

    The mutable state for the Stdlib modules is actively being tracked
    in this issue, since the OCaml 5.0.0 implementation should be both
    memory and thread-safe.

  • ocaml/ocaml#11013
    Meta-issue for OCaml 5.0 release goals

    An issue tracker that contains a checklist for branching OCaml 5.0.

  • ocaml/ocaml#11074
    OCaml 5.0 & unhandled exceptions

    A question and discussion on how unhandled exceptions should be
    handled in OCaml 5.0.


  • ocaml/ocaml#10868
    Fix off-by-1 bug when initializing frame hashtables

    The PR for runtime/frame_descriptors.c that fixes on off-by-1 bug
    when initializing frame hashtables is ready to be merged.

  • ocaml/ocaml#11040
    ThreadSanitizer issues

    An issue tracker that contains list of ThreadSanitizer runs from
    tests/parallel execution for troubleshooting race conditions.

  • ocaml/ocaml#11144
    Restore frame-pointers support for amd64

    A work-in-progress to re-introduce the lost frame-pointers support
    for AMD64 architecture, since the same was partially lost with the
    Multicore merge.


  • ocaml/ocaml#10315
    [Build] Support for composing the compiler in a dune build

    A request to use the Dune build system to build the OCaml
    compiler. This will be useful for Multicore OCaml ecosystem
    development as well.

  • ocaml/ocaml#10505
    [RFC] Require 1003.1-2008 for libunix

    A draft PR that updates the build to be compliant with The Open
    Group Base Specification Issue 6 and 7, IEEE Std 1003.1-2008.

  • ocaml/ocaml#11096
    Enable native code on FreeBSD/aarch64

    The has been updated to build natively on

  • ocaml/ocaml#11097
    Fix support for NetBSD and enable native code on NetBSD/aarch64

    The support for native builds on NetBSD/aarch64 has been enabled.

  • ocaml/ocaml#11143
    Test 32-bit build in GitHub Actions

    An i386 entry in .github/workflows/build.yml has been added to
    test 32-bit builds with GitHub Actions.

  • ocaml/ocaml#11149
    Make the bootstrap process repeatable

    The PR enables the make bootstrap step to produce the exact same
    images in boot/ocamlc and boot/ocamllex, irrespective of the OS
    and architecture.


  • ocaml/ocaml#11057
    Implement quality treatment for asynchronous actions in multicore

    A work-in-progress that reimplements the caml_process_pending
    behaviour, and provides code improvements to the asynchronous
    actions in the Multicore runtime.

  • ocaml/ocaml#11095
    Implement quality treatment for asynchronous actions in multicore (1/N)

    A first set of commits as a follow-up to the Implement quality
    treatment for asynchronous actions in
    " PR.

  • ocaml/ocaml#11110
    More ThreadSanitizer atomics and ignorelist

    An ignorelist has been added to ThreadSanitizer for Field and
    Tag_val race conditions. A CAMLno_tsan, with a justification for
    no race condition for specific functions, has been added along with
    relaxed atomics.

  • ocaml/ocaml#11137
    Introduce Store_tag_val(dst, val) and use it in the runtime

    The runtime code does not depend on Tag_val as an lvalue, and
    hence Store_tag_val(dst,val) is introduced in runtime/alloc.c.

  • ocaml/ocaml#11138
    Add C function caml_thread_has_lock

    Any C thread can now call the function caml_thread_has_lock, and
    it returns true if the thread belongs to a domain and also holds the
    lock for the same.

  • ocaml/ocaml#11142
    Gc.set now changes the minor heap size of all domains

    A draft PR to adjust the semantics of Gc.set to set the minor
    heap size for all domains.

  • ocaml/ocaml#11154
    Add Domain.get_name

    A feature request to include get_name in the Domain module,
    since the API already contains a set_name.

  • ocaml/ocaml#11156
    Post-5.00 API for changing minor heap size

    The proposed suggestions for changing the minor heap size of all
    domains post-5.00 API.


  • ocaml/ocaml#10992
    OCaml multicore memory model and C (runtime, FFI, VM)

    The document on the OCaml Multicore memory model and the use of the
    Field macro is actively being revised and updated.

  • ocaml/ocaml#11058
    runtime/HACKING.adoc: tips on debugging the runtime

    The HACKING.adoc document with information on the runtime system,
    and the runtime/HACKING.adoc file that explains troubleshooting is
    ready to be merged.

  • ocaml/ocaml#11093
    Effects manual

    The PR adds an effect handlers tutorial to the manual. The rendered
    web page is at OCaml - Language extensions.


  • ocaml/ocaml#10980
    GitHub Actions / ocamltest / testsuite / OCaml 5

    An issue tracker that contains a list of action items related to
    ocamltest and OCaml 5.

  • ocaml/ocaml#11065
    Restore basic functionality to the bytecode debugger

    The PR to handle stack backtraces is working now, and a separate PR
    will be created to handle the next instruction.

  • ocaml/ocaml#11121 gets killed by OS’s OOM-reaper on Raspberry Pi 4

    A testsuite failure report on ARM64-backend on a Raspberry Pi 4 with
    2GB of memory.


  • ocaml/ocaml#10964
    Ring-buffer based runtime tracing (eventring)

    The Eventring runtime tracing system designed for continuous
    monitoring of OCaml applications is actively being reviewed.

  • ocaml/ocaml#11090
    Program name usability issue

    A usability regression issue with Multicore runtime where top
    reports OCaml programs as Domain0.

  • ocaml/ocaml#11125
    Runtime events for minor heap reservation / allocation

    The runtime events that log the allocated sizes and critical
    sections should be emitted for the minor heap reservation and
    allocation functions.



  • ocaml/ocaml#10802
    Use 4.12 value macros in C code

    The for loop style is used for list-walking, and Val_int(0) now
    means an integer of value 0.

  • ocaml/ocaml#10958
    Only rebuild flexlink.exe when sources change

    The Makefile has been updated to only build flexdll/flexlink.exe
    when the sources have been modified.

  • ocaml/ocaml#10971
    Means of limiting how much memory is being reserved by the runtime,
    so that Valgrind and AFL can be used

    The max_domains value can now be set from OCAMLRUNPARAM to limit
    the memory usage, and to provide a good balance between usability
    and complexity in the implementation.

  • ocaml/ocaml#10991
    Use zstd for CI artifacts upload and download

    The upload and download time of CI artifacts are improved with the
    use of zstd compression.

  • ocaml/ocaml#11078
    Relax caml_initialize assertion in the debug runtime

    The assertion checks in caml_initialize are relaxed to not impede
    the debug runtime throughput.

  • ocaml/ocaml#11082
    Reserve only caml_minor_heap_max_wsz * Max_domains for the minor heap

    The initial minor heap size reservation is s * Max_domains, and
    domains can use Gc.set to increase their minor heap size beyond
    the reservation. The size of the reservation is always
    caml_minor_heap_max_wsz * Max_domains.

  • ocaml/ocaml#11123
    Gc stats: major collections count

    The use of Caml_state->stat_major_collections is removed and
    caml_major_cycles_completed global value is used to report
    statistics, as mentioned in the documentation.

  • ocaml/ocaml#11158
    Factor out reading OCAMLTOP_INCLUDE_PATH in ocaml/ocamlnat

    The identical code in ocaml and ocamlnat for parsing
    OCAMLTOP_INCLUDE_PATH has been refactored.


  • ocaml/ocaml#11037
    Assorted fixes found while restarting the Jenkins CI

    The PR includes a number of fixes such as update to the Jenkins CI
    “main” script to better handle bytecode-only builds, updates to the
    test suite, configuration tweaks and changes to the runtime system.

  • ocaml/ocaml#11054
    Respect user provided maximum stack space value, and fix debug run of tmp/ test

    This PR honors OCAMLRUNPARAM=1 for the initial stack size, and
    ensures that tmc/ applies stack restriction during
    the running stage.

  • ocaml/ocaml#11061
    dumpobj tool crashes

    A fix for the segmentation fault from tools/dumpobj on a bytecode
    program has been merged in

  • ocaml/ocaml#11076
    Adjust stack parameters for bytecode to avoid generating too many calls to caml_ensure_stack_capacity

    The stack “safety margin” has been decreased to 6 and the stack
    threshold has been increased to 32. Most bytecode functions use no
    more than 32 - 6 stack slots, and this provides a quick fix for the
    byte code regressions.

  • ocaml/ocaml#11077
    Fix dumpobj crash due to naked pointer comparison

    The use of (==) instead of (=) in dumpobj fixes the crash in
    the generic comparison function that supported naked pointers.

  • ocaml/ocaml#11094
    Domainslib producing segfaults

    A patch for the segmentation fault in fiber management fixes the
    segmentation fault caused when using domainslib on parallel programs
    with Sandmark.

  • ocaml/ocaml#11105
    Fix segfault in fiber management (issue #11094)

    An integer index into an array of lists is now maintained, instead
    of a pointer to the cache in fiber management. This fixes the
    segmentation fault reported when building parallel benchmarks with
    domainslib in Sandmark.

  • ocaml/ocaml#11141
    Fix 32-bit build

    The runtime/gc_ctrl.c has been updated to use
    ARCH_INTNAT_PRINTF_FORMAT to build for 32-bit.


  • ocaml/ocaml#10953
    ocamltest/summarize.awk not properly reporting abort failures on testsuite runs

    The PR#11088 and
    PR#11100 have been
    merged to handle the failing test runs with summarize.awk.

  • ocaml/ocaml#11084
    Disable test_cow_repeated in the lib-dynlink-private testcase when running with the debug runtime

    The testsuite/tests/lib-dynlink-private/ has been updated
    to disable test_cow_repeated with the debug runtime.

  • ocaml/ocaml#11004
    Memory model tests

    A new sub-directory in testsuite containing the memory model tests
    has been merged. These are useful for the ARMv8 and Power ports.

  • ocaml/ocaml#11088
    summarize.awk: should fail when ocamltest result is not understood

    The handling of unexpected results from an ocamltest run in
    summarize.awk have been fixed.

  • ocaml/ocaml#11099
    ARM64 CFI support

    The unwind on ARM64 for the CFI commands now work, and
    tests/unwind pass on both MacOS x86_64 and ARM64.

  • ocaml/ocaml#11124

    A series of fixes to fix the implementation
    that causes test suite failures or Raspberry Pi 4.


  • ocaml/ocaml#10884
    Fix closure marshalling from Dynlink-loaded code on Windows

    The registration of empty code fragments in natdynlink has been
    stopped, and caml_skiplist_insert updates the data pointer if the
    key is a duplicate.

  • ocaml/ocaml#10908
    Fix possible race in caml_mem_map on Windows

    A race condition when trimming the memory block has been fixed, and
    printf debugging from the concurrent minor collector in platform.c
    has been cleaned up.

  • ocaml/ocaml#11115
    Fix performance regression in systhreads on Windows

    The tick thread calls caml_thread_yield on the Windows version of
    select which was causing performance regressions. The Sleep
    function is used instead and the performance differences are
    noticeable as shown below:

    Test                            before/s     run1/s       run2/s
    lib-threads/sieve               5.36         3.18         2.47
    parallel/fib_threads            137.52       62.29        63.95
    parallel/multicore_systhreads   20.2         11.88        11.08
  • ocaml/ocaml#11116
    Fix tool-dumpobj test on Windows

    The mingw-64 runs on Inria’s CI are fixed with the update to


  • ocaml/ocaml#11008
    Document and refactor the gc-stats code

    The runtime/caml/gc_stats.h and runtime/gc_stat.c code have been
    refactored and documented.

  • ocaml/ocaml#11072
    domain.c: document the STW synchronization code

    The STW synchronization code has been documented in domain.c.

  • ocaml/ocaml#11073
    Code comprehension: why don’t STW sections keep all_domains_lock the whole time?

    The STW synchronization code has been documented in domain.c in

  • ocaml/ocaml#11120
    Man entries for warnings 69, 70, 71 and 72 are missing

    The manual entries are listed in the output of man ocamlc, and the
    warnings for 69, 70, 71 and 72 have been added.

  • ocaml/ocaml#11122
    Fix typo in Stdlib documentation comment

    A typo in stdlib/stdlib.mli has been fixed.


  • ocaml/ocaml#11092
    Enable native code on aarch64-*-openbsd*

    OCaml builds fine on OpenBSD/aarch64.

  • ocaml/ocaml#11112
    Harden -use-runtime against spaces in paths

    The PR ensures that spaces in the paths specified with
    -use-runtime work as expected.

  • ocaml/ocaml#11047
    GC stats: properly orphan allocation stats

    An orphaning process for allocation statistics has been implemented
    in this PR, where the “orphan stats” are stored in a global
    structure alloc_stats variable in gc_stats.c. On domain
    termination, the stats of the current domain are added to the
    “orphan stats”.

  • ocaml/ocaml#10925
    Rename symbol for Caml_state to caml_state

    The Caml_state macro has been renamed to caml_state to avoid a
    name collision.

  • ocaml/ocaml#10989
    Download GNU parallel directly from git

    The tools/ci/appveyor/ has been updated to
    download GNU parallel with Git.




  • ocaml-multicore/eio#206
    API request: readdir

    A new API request to list the contents of the directory, since
    Eio.Dir.t already exists.

  • ocaml-multicore/eio#207
    Add readdir feature

    A draft PR that provides an implementation of readdir feature for
    Eio, and also to discuss its API.

  • ocaml-multicore/eio#208
    Update the README to use OCaml 5.0

    A suggestion to update the README to use OCaml 5.0.


  • ocaml-multicore/eio#205
    Prepare release

    The sources have been upgraded to depend on uring.0.3, and the has been updated for a release.



  • ocaml-multicore/domainslib#68
    Scope of domainslib

    A feature request to have mpsc queues, concurrent hashmap and
    more concurrency building blocks in domainslib.

  • ocaml-multicore/domainslib#69
    Make Chan.t and Task.promise injective

    The injectivity annotations with type constructors can be usable as
    indexes of GADTs, in particular Effect.t.


  • ocaml-multicore/domainslib#65
    Fix build on trunk

    The Effect.eff -> Effect.t change has been updated to build for
    trunk, and the CI builds for 5.0.0+trunk.

  • ocaml-multicore/domainslib#66
    Domainslib.0.4.1 build failure with OCaml 5.0.0+trunk

    A newer release of domainslib.0.4.2 has been updated to build with
    OCaml 5.0.0+trunk.

  • ocaml-multicore/domainslib#67
    Fix Task.parallel_for_reduce on empty loop

    A corner-case for an empty loop is now correctly handled for
    Task.parallel_for_reduce in lib/







  • ocaml-bench/sandmark#119
    Additional benchmarks - hamming and soli

    A draft version of the and benchmarks have
    been added to Sandmark.

  • ocaml-bench/sandmark#299
    Irmin 3 benchmarks

    A request to update the Sandmark Irmin benchmark which replays the
    access patterns for Tezos.

  • ocaml-bench/sandmark#319
    Added two serial benchmarks namely: hamming and soli with their respectively

    The PR adds the Hamming and Soli sequential benchmarks to Sandmark.

  • ocaml-bench/sandmark#275
    Move from drone CI to GitHub actions

    The CI jobs from .drone.yml need to be migrated to run with GitHub
    Actions workflow.

  • ocaml-bench/sandmark#316

    A new .github/workflows/main.yml GitHub Actions file has been
    added to run in the CI.

  • ocaml-bench/sandmark#18
    js_of_ocaml fails to run on multicore

    A draft PR to build js_of_ocaml in Sandmark for Multicore OCaml
    has been created.

  • ocaml-bench/sandmark#262
    ocaml-migrate-parsetree.2.2.0+stock fails to compile with ocaml.5.00.0+trunk

    ocaml-migrate-parsetree is no longer required for trunk with

  • ocaml-bench/sandmark#310
    Remove js_of_ocaml

    A work-in-progress to build js_of_caml-compiler with
    5.0.0+trunk, as frama-c is not compatible with ocaml/ocaml.

  • ocaml-bench/sandmark#272
    Delay benchmark runs if the machine is active

    A load average check for threshold 0.6 needs to be verified before
    running the benchmarks.

  • ocaml-bench/sandmark#302
    Renaming suggestions for *run_config.json files

    The current *run_config.json files need to be renamed as follows:

    • run_config.jsonsequential.json
    • multicore_parallel_run_config.jsonparallel_turing.json
    • multicore_parallel_navajo_run_config.jsonparallel_navajo.json
    • micro_multicore.jsonmicro.json
  • ocaml-bench/sandmark#309
    Outreachy Applicants: set-up and how-to

    Sandmark is participating in the Outreachy program, and the
    necessary setup and how-to instructions to get started on the
    project have been provided.

  • ocaml-bench/sandmark#315
    Rename Json Files

    A PR to rename the current *run_config.json files to be more
    meaningful for their intended purpose.

  • ocaml-bench/sandmark#317
    Add checks for loadavg

    An ongoing PR to add a loadavg check to ensure that the server is
    not busy before actually running the benchmarks.


  • ocaml-bench/sandmark#282
    Analyse Bytecode Performance

    The run_config_byte.json file now allows you to run byte code
    version of the Sandmark benchmarks.

  • ocaml-bench/sandmark#298
    Support to build and run benchmarks in byte mode

    A run_config_byte.json file has been added to build and run the
    benchmarks in byte mode. You can test the same using:

        RUN_CONFIG_JSON=run_config_byte.json make ocaml-versions/5.00.0+trunk.bench 
  • ocaml-bench/sandmark#279
    Update notebooks/ To 5.00.0+trunk

    The Jupyter notebooks in the notebooks/ folder have been updated to
    use 5.0.0+trunk.

  • ocaml-bench/sandmark#301
    Port sandmark nightly UI to sandmark notebooks

    The Sandmark-nightly UI changes have been ported to the Sandmark
    notebooks/ and work with 5.0.0+trunk OCaml variant.

  • ocaml-bench/sandmark#305
    re-enable disabled benchmarks

    The filter check that disabled alt-ergo, frama-c and
    js_of_ocaml benchmarks have been enabled in the Jupyter notebooks.

  • ocaml-bench/sandmark#274
    Custom Variant Support

    The feature request to specify developer branches, configure
    options, runtime parameters, a name for the OCaml variant,
    dependency package overrides, package removal list, and an expiry
    date until which the Sandmark nightly runs should occur has been
    merged to Sandmark.

  • ocaml-bench/sandmark#286
    Update check_url and validate URL in custom.json files

    The check_url target in the Makefile checks if a URL is present
    for each and every entry in the custom.json file, and also if the
    URL contains a downloadable file.

  • ocaml-bench/sandmark#297
    Added dynamic package override and removal for Custom Support Variant

    The ability to override and remove dependency packages dynamically
    is now supported with the Custom Support Variant feature.

  • ocaml-bench/sandmark#306
    Update check_url and added check_jq

    A check_jq functionality has been added in the Makefile to verify
    that the config.json files can be parsed by jq. The check_url now
    verifies that the provided URL is downloadable with wget.

  • ocaml-bench/sandmark#307
    Use pristine sandmark clone for each build

    A fresh clone of Sandmark is used now before each and every
    sandmark-nightly run, instead of relying on make clean.

  • ocaml-bench/sandmark#300
    Use 5.0.0+trunk name and version

    Sandmark OCaml variants have been updated to use the 5.0.0+trunk
    name and version number.

  • ocaml-bench/sandmark#304
    Parallel benchmarks get killed with SEGV with trunk and domainslib.0.4.2

    The PR#11105 fix in the
    fiber management resolves the segmentation fault caused in parallel
    benchmarks with trunk and domainslib.0.4.2.

  • ocaml-bench/sandmark#308
    Move nightly scripts to Sandmark

    The nightly cron run scripts from sandmark-nightly have been moved
    to sandmark.

  • ocaml-bench/sandmark#312
    Removed failure:ignore

    The failure:ignore option has been removed from .drone.yml CI as
    5.0.0+trunk builds are stable now.



  • ocaml-bench/sandmark-nightly#5
    Status of disabled benchmarks

    The Jupyter notebooks in Sandmark have been ported with the changes
    from sandmark-nightly, and the benchmarks have been enabled.

  • ocaml-bench/sandmark-nightly#41
    Show Sandmark branch and version in the UI

    The UI now shows the Sandmark branch and version number in building
    and running the benchmarks.

  • ocaml-bench/sandmark-nightly#48
    Numbered list is misaligned in the home page

    The list indentation has been fixed in the home page.

  • ocaml-bench/sandmark-nightly#49
    Add Sandmark info to sandmark-nightly

    The commit version and branch of Sandmark used in the
    sandmark-nightly runs are displayed in the UI.

  • ocaml-bench/sandmark-nightly#52
    Resize UI to show the full OCaml variant name

    The OCaml variant name width has been enlarged to show the full name
    in the UI.

  • ocaml-bench/sandmark-nightly#53
    Show benchmarks in a table to read the tooltip

    The selected benchmarks are displayed as a table and tooltip support
    has been added.

  • ocaml-bench/sandmark-nightly#54
    Hide instrumented runtime pages

    The instrumented runtime is currently not used, and hence the
    respective pages are hidden from the user.



  • ocurrent/current-bench#306
    WIP ocaml compiler benchmarks

    A work-in-progress, high-level issue tracker for building
    ocaml/ocaml compiler benchmarks, and necessary tooling with the
    current-bench project.

  • ocurrent/current-bench#318
    Cobench user library

    A request for a library to ease the process of creating and using
    benchmarks with the current-bench project.

  • ocurrent/current-bench#329
    Use a standard record instead of a Js.object for metric data in BenchmarkData.res

    A refactoring task for the metric data to use a standard record
    instead of a Js.object.

  • ocurrent/current-bench#330
    Looking at the past

    A list of UI changes to better view the past benchmark results for
    the dune team.

  • ocurrent/current-bench#332
    Consider using time as the x-axis

    A wishlist entry to visualize the graphs with time on the x-axis.

  • ocurrent/current-bench#333
    Docker build arguments

    The use of --build-args for Docker in the OCluster pipeline is
    required for custom Dockerfile runs with Sandmark nightly.

  • ocurrent/current-bench#344
    Show the same sub-metric in the same color across different metric graphs

    A UI enhancement to show the same colour for a sub-metric across all
    the graphs.


  • ocurrent/current-bench#326
    Frontend: Fix bug with using same x-axis for all metrics

    The respective meta-data for all the commits, and for every metric
    in the x-axis is now correctly displayed in the UI.

  • ocurrent/current-bench#334
    Fix CI

    A minor fix in pipeline/libl/ to correctly
    match and resolve the benchmark name.

  • ocurrent/current-bench#337
    Fix missing value frontend crash

    A couple of fixes for Js.Obj.assign and the front-end when an
    overlaid metric is added to a branch.

  • ocurrent/current-bench#340
    Missing metric indicator fixes

    The BenchmarkTest.res and LineGraph.res have been fixed to
    handle missing metric indicator.

  • ocurrent/current-bench#341
    frontend: Fix broken line numbers when filling in missing commits

    A fix in frontend/src/AppHelpers.res to handle broken line numbers
    when filling missing commits.

  • ocurrent/current-bench#343
    Fix colors changing on hiding some lines and change color palette

    An aesthetic UI change on the color palette, and fix for color
    changes when hiding lines.

  • ocurrent/current-bench#345
    Correctly handle carriage returns when counting line numbers

    A proper way to handle \r, \r\n, and \n in the browser when
    showing the line numbers in the UI.

  • ocurrent/current-bench#323
    Allow clicking on the legend to show/hide plot lines and use more columns

    The legend now uses more columns when clicking on the show/hide plot
    in the UI.

  • ocurrent/current-bench#324
    Disabled worker / docker image

    The frontend automatically selects the first “environment” (worker +
    Docker image) and the system may contain disabled ones. The
    environment list now filters and shows only the active entries.

  • ocurrent/current-bench#331
    Show only workers with valid runs in workers dropdown

    The workers for a specific repo_id and pull_number alone are now
    shown in the dropdown menu.

  • ocurrent/current-bench#339
    frontend: Filter out values less than 0.5% of maximum

    The values less than 0.5% of the maximum are now filtered out so
    that Array.getExn does not crash the frontend.

  • ocurrent/current-bench#342
    Frontend: hide table comparison rows NA/NA

    The NA/NA is used in the frontend when there are no branch forks
    to compare in the graphs.


  • ocurrent/current-bench#328
    Add a Cobench client library for pushing results with the HTTP API

    The Irmin benchmark monthly results need to be uploaded to
    current-bench, and hence a Cobench client library has been created
    to be used with the HTTP API.

  • ocurrent/current-bench#336
    Docker build arguments

    The environment/*.conf file now supports an optional build_args
    setting that can be used to pass environment variables to make bench. This is useful for sandmark-nightly as well for cron-like
    scheduling of fast and slow benchmarks.

    "repositories": [
        "name": "local/local",
        "worker": "autumn",
        "build_args": ["FOO=42"]
  • ocurrent/current-bench#338
    Use latest OCurrent for logs line number links

    The ocurrent-bench.opam and pipeline/pipeline.opam files have
    been updated to use the latest OCurrent version.

We would like to thank all the OCaml users, developers and
contributors in the community for their continued support to the


  • AFL: American Fuzzy Lop
  • AMD: Advanced Micro Devices
  • API: Application Programming Interface
  • ARM: Advanced RISC Machines
  • AWK: Aho Weinberger Kernighan
  • BSD: Berkeley Software Distribution
  • CFI: Call Frame Information
  • CI: Continuous Integration
  • FD: File Descriptor
  • FFI: Foreign Function Interface
  • GADT: Generalized Algebraic Data Type
  • GC: Garbage Collector
  • GNU: GNU’s Not Unix
  • HTTP: Hypertext Transfer Protocol
  • IEEE: Institute of Electrical and Electronics Engineers
  • JSON: JavaScript Object Notation
  • MD: Markdown
  • OOM: Out Of Memory
  • OPAM: OCaml Package Manager
  • OS: Operating System
  • PR: Pull Request
  • RFC: Request For Comments
  • STW: Stop The World
  • UI: User Interface
  • URL: Uniform Resource Locator
  • VM: Virtual Machine
  • WSL: Windows Subsystem for Linux

Do we have any benchmarks that compare effectful and monadic code? I want something simpler than http servers from GitHub - ocaml-multicore/retro-httpaf-bench: Benchmarking environment for http servers

1 Like

The benchmarks from the “Retrofitting Effect handlers to OCaml” PLDI 2021 paper ([2104.00250] Retrofitting Effect Handlers onto OCaml) is available here: edit: retro-concurrency/bench at master · prismlab/retro-concurrency · GitHub GitHub - prismlab/retro-concurrency-bench: Microbenchmarks from the PLDI21 paper "Retrofitting Effect Handlers onto OCaml" . See sections 6.2 and 6.3 in the paper.

It looks like retro-concurrency repo is not avaialble on . Is it a private repo? Could you double check?

Indeed. I made the repo public now.

I’ve moved the microbenchmarks alone to a separate repo: GitHub - prismlab/retro-concurrency-bench: Microbenchmarks from the PLDI21 paper "Retrofitting Effect Handlers onto OCaml". This repo also contains instructions to run the docker container that runs the benchmarks from the paper with the custom compiler variants.

Out of curiosity, can we expect further monthly updates on the multicore project? Are they moved someplace else, or will they not be provided anymore?

I assume they’re part of the changelog now, e.g. OCaml 5.0, first normal alpha release


Thank you for the link!