# Io.Threaded PoC reimplementation · gitcafe/zig

[View on GitCafe](https://git.cafe/gitcafe/zig/commit/8eaebf5939491b005e392698ec6e890ebaf0f86b)

Repository: [gitcafe/zig](https://git.cafe/gitcafe/zig)

Visibility: public

Requested revision: 8eaebf5939491b005e392698ec6e890ebaf0f86b

Requested commit: 8eaebf5939491b005e392698ec6e890ebaf0f86b

Commit: 8eaebf5939491b005e392698ec6e890ebaf0f86b

Tree: 0b4d293734202a30cff6be585149402e4bea1abf

Author: Loris Cro

Committer: Andrew Kelley

## Message

```
Io.Threaded PoC reimplementation

This is a reimplementation of Io.Threaded that fixes the issues
highlighted in the recent Zulip discussion. It's poorly tested but it
does successfully run to completion the litmust test example that I
offered in the discussion.

This implementation has the following key design decisions:

- `t.cpu_count` is used as the threadpool size.
- `t.concurrency_limit` is used as the maximum number of
  "burst, one-shot" threads that can be spawned by `io.concurrent` past
  `t.cpu_count`.
- `t.available_thread_count` is the number of threads in the pool that
  is not currently busy with work (the bookkeeping happens in the worker
  function).
- `t.one_shot_thread_count` is the number of active threads that were
  spawned by `io.concurrent` past `t.cpu_count`.

In this implementation:

- `io.async` first tries to decrement `t.available_thread_count`. If
  there are no threads available, it tries to spawn a new one if possible,
  otherwise it runs the task immediately.
- `io.concurrent` first tries to use a thread in the pool same as
  `io.async`, but on failure (no available threads and pool size limit
  reached) it tries to spawn a new one-shot thread. One shot threads
  run a different main function that just executes one task, decrements
  the number of active one shot threads, and then exits.

A relevant future improvement is to have one-shot threads stay on for a
few seconds (and potentially pick up a new task) to amortize spawning
costs.

```

## Parents

- [d54fbc01234688b37a48b29fee499529a500ccf5](https://git.cafe/gitcafe/zig/commit/d54fbc01234688b37a48b29fee499529a500ccf5?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zig/tree/8eaebf5939491b005e392698ec6e890ebaf0f86b?format=markdown)
