- Notifications
You must be signed in to change notification settings - Fork40
©️ Concurrent Programming Library (Coroutine) for C11
License
NotificationsYou must be signed in to change notification settings
sharow/libconcurrent
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
tiny asymmetric-coroutine library.
- asymmetric-coroutine
- bidirectional communication by
yield_value
/resume_value
- native context switch
- C11
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>#defineSTACK_SIZE (1024 * 2)noreturnvoidaccumulator(structconcurrent_ctx*ctx){int*v=ctx_get_resume_value(ctx);inttotal=*v;for (;;) {v=yield_value(ctx,&total);// send total / receive next valuetotal+=*v; }}intmain(void){structconcurrent_ctx*ctx;uint8_tstack[STACK_SIZE];uint8_tctx_alloc[ctx_sizeof()];concurrent_init();ctx= (structconcurrent_ctx*)ctx_alloc;ctx_construct(ctx,stack,STACK_SIZE,accumulator,NULL);for (inti=1;i <=10;i++) {int*total=resume_value(ctx,&i);// send value / receive totalprintf("total = %d\n",*total); }ctx_destruct(ctx);concurrent_fin();returnEXIT_SUCCESS;}/*$ gcc -o sample sample.c -lconcurrent.a$ ./sampletotal = 1total = 3total = 6total = 10total = 15total = 21total = 28total = 36total = 45total = 55*/
- for x86_64/i686:nasm
$ git clone https://github.com/sharow/libconcurrent.git libconcurrent$ cd libconcurrent$ make$ sudo make install
Available in ports collection asdevel/libconcurrent
$ brew install nasm
$ make test
-- output: (Xeon E3 2.5Ghz)3000000 context switch in 373.5 msone context switch in 125 ns8031333 resume/yield pair per second-- output: (RaspberryPi2 ARMv7 900MHz)3000000 context switch in 2861.8 msone context switch in 954 ns1048287 resume/yield pair per second
- Portable Coroutine Library (PCL):http://xmailserver.org/libpcl.html
- libtask:https://code.google.com/p/libtask/
- libconcurrency:http://code.google.com/p/libconcurrency/
- libcoro:http://software.schmorp.de/pkg/libcoro.html
- libcoroutine:https://github.com/stevedekorte/coroutine
- coro:http://www.goron.de/~froese/coro/
- libfiber:http://www.rkeene.org/projects/info/wiki/22
- mill:https://github.com/sustrik/mill
- fcontext:https://github.com/reginaldl/fcontext
- libwire:https://github.com/baruch/libwire
- coroutine(A asymmetric coroutine library for C):https://github.com/cloudwu/coroutine
- coroutine(a asymmetric coroutine (lua like) with fixed-size stack):https://github.com/xphh/coroutine
- coroutine(coroutine library with pthread-like interface in pure C):https://github.com/Marcus366/coroutine
- coroutines(A lightweight coroutine library written in C and assembler):https://github.com/xya/coroutines
- micro:https://github.com/mikewei/micoro