aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/thread.cc6
-rw-r--r--lib/thread.h23
2 files changed, 29 insertions, 0 deletions
diff --git a/lib/thread.cc b/lib/thread.cc
index 31161ab..e6777c0 100644
--- a/lib/thread.cc
+++ b/lib/thread.cc
@@ -56,4 +56,10 @@ namespace nMatcha {
assert(mExecutor);
::yield(mExecutor->getStackPtr(), &mStackPtr);
}
+
+ std::unique_ptr<Thread> FnThread::make(UserFn f) { return std::make_unique<FnThread>(CreatorToken{}, f); }
+
+ void FnThread::threadFn() { mUserFn(*this); }
+
+ void FnThread::yield() { Thread::yield(); }
} // namespace nMatcha
diff --git a/lib/thread.h b/lib/thread.h
index d983734..3304892 100644
--- a/lib/thread.h
+++ b/lib/thread.h
@@ -2,6 +2,9 @@
#pragma once
+#include <functional>
+#include <memory>
+
namespace nMatcha {
struct Executor;
@@ -26,4 +29,24 @@ namespace nMatcha {
friend struct Executor;
const Executor* mExecutor;
};
+
+ struct Yielder {
+ virtual void yield() = 0;
+ };
+
+ struct FnThread : public Thread, public Yielder {
+ using UserFn = std::function<void(Yielder&)>;
+ static std::unique_ptr<Thread> make(UserFn f);
+
+ private:
+ virtual void threadFn() override;
+ virtual void yield() override;
+
+ UserFn mUserFn;
+
+ enum class CreatorToken {};
+
+ public:
+ FnThread(CreatorToken, UserFn f) : mUserFn(f) {}
+ };
} // namespace nMatcha