Skip to content

disruptek/insideout

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

insideout

This is an experimental concurrency runtime for Nim.

Test Matrix GitHub release (latest by date) Minimum supported Nim version License IRC

We think it's easier to move continuations from thread to thread than it is to move arbitrary data. We offer API that lets you imperatively move your continuation to other thread pools without any locking or copies.

This experiment has expanded to support detached threads, channels with backpressure, lock-free queues, and a "local" event queue for I/O and signal handling.

Goals

  • extremely high efficiency, but
  • favor generality over performance
  • zero-copy migration among threads
  • lock-free without busy loops
  • detached threads for robustness
  • idiomatic; minimal boilerplate
  • standard Continuation passing
  • arbitrary ref and ptr passing
  • expose thread affinity, attributes
  • event queue included for I/O
  • enable incremental CPS adoption
  • be the concurrency-lib's toolkit

Performance

Adequate.

Inside a single thread, concurrency is cooperative and lock-free, so if you don't yield to the dispatcher, your continuation may only be interrupted by a signal from another thread. At present, the only occasions for interruption are when you call halt() on a thread, or use the pause/resume functions named freeze() and thaw().

Efficiency

Empty continuations are 40-bytes each. Queue overhead is 10-bytes per object. One billion queued continuations thus occupies 50gb of memory.

Toys are starting to run a little more slowly due to overhead from things like thread cancellation, signal handling and, more generally, the event queue.

That said, the tests demonstrate using the (richest) API to run millions of continuations per second on modern desktop hardware.

Support

insideout supports define:useMalloc, mm:arc, backend:c, and POSIX threads. insideout does not support mm:orc.

insideout is primarily developed using Nimskull and may not work with mainline Nim.

insideout is tested with compiler sanitizers to make sure it doesn't demonstrate memory leaks or data-races.

Documentation

Nim's documentation generator breaks when attempting to read insideout.

Define insideoutValgrind=on to enable Valgrind-specific annotations.

License

MIT