-
Notifications
You must be signed in to change notification settings - Fork 0
simple task dispatching primitives
License
sueszli/sheaf
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
sheaf: task dispatching made simple ⣀ ⢀⡀ ⣰⣿⡆ ⣄ ⢀⣴⣿⡇ ⢠⣄ ⣿⣿⡿ ⢀⡀ ⣸⣿ ⢸⣿⡿ ⠈⣿⣆⠘⠟⢀⣼⣿⠁ ⢀ ⣠⡀⢹⣿⡇⠈⣁⣤⣶⠖ ⣀⠙⢿⡆⢰⣿⡿⠃ ⣰⣿⡇ ⣿⣧⠈⠏⢠⣾⠿⠿⠋ ⢻⣷⡀⠁⠈⢁⣤⣶⠁⣴⡄⢸⣿⣿⡇ ⣿⣿⠂⣀⣠⣤⣤⡄ ⠈⢿⣿ ⣴⣿⡿⠃ ⣿⣷ ⠟⢁⣠⣶⠇ ⠈⠁⢴⣿⡿⠟⠉ ⠙ ⠛⠋⠁ ⣦⠈⢿⠃⣰⣿⡿⠏ ⣾⠆ ⣴⣿ ⣿ ⣿⣷⡀ ⠋⣁⣤⡤ ⢰⡏ ⢸⣆ ⣾⣿⡿ ⣿ ⢻⣿⠃⣰⣿⣿⠟ ⢀⡿ ⢿⣿⡄⠹⠛⢁⣤⡤ ⣿ ⠈⡀⠛⠋⠁ ⣼⡇⢰⣆⠈⢿⠇⢠⣾⣿⠟ ⣿ ⢸⠃ ⢀⣿ ⢸⣿⣆⠈ ⠋⣉⣠⡄ ⣿ ⣿ ⢸⡇ ⠘⢿⡟⢀⣶⣿⡿⠋ ⢻⡆ ⢸⡏ ⣾⡇ ⢀⣀⠘⠛⠉ ⠘⠓ ⠘⠃ ⠛⠁ ⠘⠋ # features a minimal, zero-dependency, proof-of-concept library for task dispatching in c: - pthreads for compute-heavy tasks, inspired by goroutines - cooperative async for io-heavy tasks, inspired by the javascript event loop - defer statement for simple RAII, leveraging gcc's cleanup attribute # usage ``` $ tail -n +10 src/demo_go.c static void task(u32 id) { usleep((u32)((rand() % 1000) * 1000)); printf("finished task %u\n", id); } i32 main(void) { u32 *results = malloc(4 * sizeof(u32)); defer({ free(results); printf("cleaned up\n"); }); go({ task(1); }); go({ task(2); }); go({ task(3); }); wait(); return EXIT_SUCCESS; } $ make demo-go finished task 2 finished task 1 finished task 3 cleaned up $ tail -n +6 src/demo_async.c static void ping(void) { for (u8 i = 0; i < 2; i++) { printf("ping\n"); async_yield(); } } static void pong(void) { for (u8 i = 0; i < 2; i++) { printf("pong\n"); async_yield(); } } i32 main(void) { async_spawn(ping); async_spawn(pong); async_run_all(); return EXIT_SUCCESS; } $ make demo-async ping pong ping pong ```
About
simple task dispatching primitives