libfringe/README.md

2.4 KiB

travis appveyor rustdoc

libfringe

libfringe is a library implementing lightweight context switches, without relying on kernel services. It can be used in hosted environments (using std) as well as on bare metal (using core).

It provides high-level, safe abstractions:

  • an implementation of internal iterators, also known as generators, Generator.

It also provides low-level, very unsafe building blocks:

  • a flexible, low-level context-swapping mechanism, Context;
  • a trait that can be implemented by stack allocators, Stack;
  • a stack allocator based on anonymous memory mappings with guard pages, OsStack.

Performance

libfringe does context switches in 2.5ns flat on x86_64!

test swap ... bench:         5 ns/iter (+/- 1)

…and on x86:

test swap ... bench:         5 ns/iter (+/- 1)

Limitations

libfringe currently doesn't work on anything but x86 and x86_64, and is untested on anything but Linux.

Installation

libfringe is a Cargo package. It's not stable software yet, so you'll have to use it as a git dependency. Add this to your Cargo.toml:

[dependencies.fringe]
git = "https://github.com/edef1c/libfringe.git"

Feature flags

libfringe provides some optional features through Cargo's feature flags. Currently, all of them are enabled by default.

valgrind

Valgrind integration. libfringe will register context stacks with Valgrind.