// No copyright #pragma once #include #include #include #include #include #include "iface/subsys/clock.hh" #include "iface/subsys/concurrency.hh" #include "iface/subsys/logger.hh" #include "iface/env.hh" #include "iface/lambda.hh" #include "core/luajit/context.hh" #include "core/luajit/thread.hh" #include "core/logger.hh" namespace nf7::core::luajit { class Lambda : public nf7::LambdaBase, public std::enable_shared_from_this { public: explicit Lambda(nf7::Env& env, const std::shared_ptr& func) : LambdaBase(), clock_(env.GetOr()), concurrency_(env.Get()), logger_(env.GetOr(NullLogger::instance())), lua_(env.Get()), func_(func) { } uint64_t exitCount() const noexcept { return exit_count_; } uint64_t abortCount() const noexcept { return abort_count_; } private: class Thread; private: void Main(const nf7::Value& v) noexcept override; void Resume(TaskContext&) noexcept; void PushLuaContextObject(TaskContext&) noexcept; private: const std::shared_ptr clock_; const std::shared_ptr concurrency_; const std::shared_ptr logger_; const std::shared_ptr lua_; const std::shared_ptr func_; std::shared_ptr thread_; std::shared_ptr ctx_; std::atomic exit_count_ = 0; std::atomic abort_count_ = 0; std::deque recvq_; uint64_t recv_count_ = 0; bool awaiting_value_ = false; }; } // namespace nf7::core::luajit