Skip to content

sharow/libconcurrent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

libconcurrent

zlib License

tiny asymmetric-coroutine library.

Description

  • asymmetric-coroutine
  • bidirectional communication by yield_value/resume_value
  • native context switch
  • C11

Supported Platforms

x86_64 i686 ARM(v6/v7) AArch64 (contributor)
Linux ✔️ ✔️ ✔️ ✔️
FreeBSD ✔️ ✔️ @t6
OSX ✔️ ✖️ ✖️ ✔️ @kpamnany
(contributor) @mitghi

Code Example

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdnoreturn.h> #include <concurrent/concurrent.h> #include <concurrent/shortname.h> #define STACK_SIZE (1024 * 2) noreturn void accumulator(struct concurrent_ctx *ctx) { int *v = ctx_get_resume_value(ctx); int total = *v; for (;;) { v = yield_value(ctx, &total); // send total / receive next value total += *v; } } int main(void) { struct concurrent_ctx *ctx; uint8_t stack[STACK_SIZE]; uint8_t ctx_alloc[ctx_sizeof()]; concurrent_init(); ctx = (struct concurrent_ctx *)ctx_alloc; ctx_construct(ctx, stack, STACK_SIZE, accumulator, NULL); for (int i = 1; i <= 10; i++) { int *total = resume_value(ctx, &i); // send value / receive total printf("total = %d\n", *total); } ctx_destruct(ctx); concurrent_fin(); return EXIT_SUCCESS; } /* $ gcc -o sample sample.c -lconcurrent.a $ ./sample total = 1 total = 3 total = 6 total = 10 total = 15 total = 21 total = 28 total = 36 total = 45 total = 55 */

Requirements for build

  • for x86_64/i686: nasm

Installation

$ git clone https://github.com/sharow/libconcurrent.git libconcurrent $ cd libconcurrent $ make $ sudo make install 

for FreeBSD

Available in ports collection as devel/libconcurrent

for OSX

$ brew install nasm 

Tests

$ make test 

Benchmark

examples/many_context1.c:

-- output: (Xeon E3 2.5Ghz) 3000000 context switch in 373.5 ms one context switch in 125 ns 8031333 resume/yield pair per second -- output: (RaspberryPi2 ARMv7 900MHz) 3000000 context switch in 2861.8 ms one context switch in 954 ns 1048287 resume/yield pair per second 

VS.

About

©️ Concurrent Programming Library (Coroutine) for C11

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 5