:copyright: Concurrent Programming Library (Coroutine) for C11
tiny asymmetric-coroutine library.
yield_value
/resume_value
x86_64 | i686 | ARM(v6/v7) | AArch64 | (contributor) | |
---|---|---|---|---|---|
Linux | ![]() |
![]() |
![]() |
![]() |
|
FreeBSD | ![]() |
![]() |
![]() |
![]() |
@t6 |
OSX | ![]() |
![]() |
![]() |
![]() |
@kpamnany |
(contributor) | @mitghi |
#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
*/
$ git clone https://github.com/sharow/libconcurrent.git libconcurrent
$ cd libconcurrent
$ make
$ sudo make install
Available in ports collection as devel/libconcurrent
$ brew install nasm
$ make test
-- 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