aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/2023-01-14-xpost-matcha-threads.md
diff options
context:
space:
mode:
authorJohannes Stoelp <johannes.stoelp@gmail.com>2024-04-28 18:31:51 +0200
committerJohannes Stoelp <johannes.stoelp@gmail.com>2024-04-28 18:31:51 +0200
commit81779e3dd91e147c883974588a3be0410f225d42 (patch)
tree75b75cb5eab276bf801a4a5021ca88b2c34c33b2 /content/2023-01-14-xpost-matcha-threads.md
parent801e1f4793faa64b8de4c2b92a9c5dbcd818b969 (diff)
downloadblog-81779e3dd91e147c883974588a3be0410f225d42.tar.gz
blog-81779e3dd91e147c883974588a3be0410f225d42.zip
xpost: add figure to match threads
Diffstat (limited to 'content/2023-01-14-xpost-matcha-threads.md')
-rw-r--r--content/2023-01-14-xpost-matcha-threads.md73
1 files changed, 0 insertions, 73 deletions
diff --git a/content/2023-01-14-xpost-matcha-threads.md b/content/2023-01-14-xpost-matcha-threads.md
deleted file mode 100644
index 9500300..0000000
--- a/content/2023-01-14-xpost-matcha-threads.md
+++ /dev/null
@@ -1,73 +0,0 @@
-+++
-title = "xpost: Cooperative-multitasking studies (matcha-threads)"
-
-[taxonomies]
-tags = ["threading", "linux", "x86", "arm", "riscv"]
-+++
-
-This is a cross post to a **cooperative-multitasking implementation** that I
-did in the past and hosted on github [>> matcha-threads <<][matcha].
-
-Cooperative-multitasking allows to perform the thread scheduling in user space.
-Executing threads need to give the control back to the `scheduler` such that
-other threads can run. Since control is returned explicitly to the scheduler,
-threads need to **"cooperate"**.
-
-The following code snippet shows an example of two such threads:
-```cpp
-#include "lib/executor.h"
-#include "lib/thread.h"
-#include <cstdio>
-
-void like_tea(nMatcha::Yielder& y) {
- std::puts("like");
- y.yield();
- std::puts("tea");
-}
-
-int main() {
- nMatcha::Executor e;
- e.spawn(nMatcha::FnThread::make(like_tea));
- e.spawn(nMatcha::FnThread::make([](nMatcha::Yielder& y) {
- std::puts("I");
- y.yield();
- std::puts("green");
- }));
- e.run();
- return 0;
-}
-```
-
-Which gives the following output when being run:
-```txt
-I
-like
-green
-tea
-```
-
-The main focus of that project was to understand the fundamental mechanism
-underlying cooperative-multitasking and implement such a `yield()` function as
-shown in the example above.
-
-Looking at the final implementation, the yield function does the following:
-```txt
-yield:
- 1. function prologue
- 2. push callee-saved regs to current stack
- 3. swap stack pointers (current - new)
- 4. pop callee-saved regs from new stack
- 5. function epilogue & return
-```
-
-Implementations for different ISAs are available here:
-- [x86_64][yield-x86]
-- [arm64][yield-arm64]
-- [armv7a][yield-arm]
-- [riscv64][yield-rv64]
-
-[matcha]: https://github.com/johannst/matcha-threads
-[yield-x86]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/x86_64/yield.s
-[yield-arm]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm/yield.s
-[yield-arm64]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/arm64/yield.s
-[yield-rv64]: https://github.com/johannst/matcha-threads/blob/master/lib/arch/riscv64/yield.s