diff --git a/src/lua-module.cpp b/src/lua-module.cpp index 33a70df..933e411 100644 --- a/src/lua-module.cpp +++ b/src/lua-module.cpp @@ -8,35 +8,16 @@ extern "C" #include "threading.h" #include "shared-table.h" -sol::table core::init_state(sol::state_view& lua) +extern "C" int luaopen_libwoofer(lua_State *L) { - sol::usertype thread_api( - sol::call_construction(), sol::constructors>(), - "join", &LuaThread::join, - "thread_id", &LuaThread::thread_id - ); - sol::stack::push(lua, thread_api); - auto thread_obj = sol::stack::pop(lua); - - sol::usertype share_api( - sol::call_construction(), sol::default_constructor, - sol::meta_function::new_index, &core::SharedTable::luaSet, - sol::meta_function::index, &core::SharedTable::luaGet - ); - sol::stack::push(lua, share_api); - auto share_obj = sol::stack::pop(lua); - + sol::state_view lua(L); + auto thread_obj = threading::LuaThread::get_user_type(lua); + auto share_obj = share_data::SharedTable::get_user_type(lua); sol::table public_api = lua.create_table_with( "thread", thread_obj, "share", share_obj ); - return public_api; -} - -extern "C" int luaopen_libwoofer(lua_State *L) -{ - sol::state_view lua(L); - sol::stack::push(lua, core::init_state(lua)); + sol::stack::push(lua, public_api); return 1; } diff --git a/src/shared-table.cpp b/src/shared-table.cpp index a11353b..dd85ad3 100644 --- a/src/shared-table.cpp +++ b/src/shared-table.cpp @@ -3,13 +3,17 @@ #include #include -namespace core { +namespace share_data { -void SharedTable::bind(sol::state_view& lua) noexcept { - lua.new_usertype("shared_table", - sol::meta_function::new_index, &SharedTable::luaSet, - sol::meta_function::index, &SharedTable::luaGet, - sol::meta_function::length, &SharedTable::size); +sol::object SharedTable::get_user_type(sol::state_view& lua) noexcept { + static sol::usertype type( + sol::call_construction(), sol::default_constructor, + sol::meta_function::new_index, &share_data::SharedTable::luaSet, + sol::meta_function::index, &share_data::SharedTable::luaGet, + sol::meta_function::length, &SharedTable::size + ); + sol::stack::push(lua, type); + return sol::stack::pop(lua); } void SharedTable::luaSet(sol::stack_object luaKey, sol::stack_object luaValue) noexcept { @@ -65,4 +69,4 @@ TablePool& defaultPool() noexcept { return pool; } -} // core \ No newline at end of file +} // core diff --git a/src/shared-table.h b/src/shared-table.h index c640f19..f1c9a37 100644 --- a/src/shared-table.h +++ b/src/shared-table.h @@ -9,9 +9,7 @@ #include #include -namespace core { - -sol::table init_state(sol::state_view& lua); +namespace share_data { class SharedTable { public: @@ -20,8 +18,7 @@ public: void luaSet(sol::stack_object luaKey, sol::stack_object luaValue) noexcept; sol::object luaGet(sol::stack_object key, sol::this_state state) noexcept; - // Add usertype to state - static void bind(sol::state_view& lua) noexcept; + static sol::object get_user_type(sol::state_view& lua) noexcept; private: // lau bindings size_t size() noexcept; diff --git a/src/spin-mutex.h b/src/spin-mutex.h index d497a32..f5b6537 100644 --- a/src/spin-mutex.h +++ b/src/spin-mutex.h @@ -3,7 +3,7 @@ #include #include -namespace core { +namespace share_data { class SpinMutex { public: diff --git a/src/stored-object.cpp b/src/stored-object.cpp index b72ddde..a3a05f6 100644 --- a/src/stored-object.cpp +++ b/src/stored-object.cpp @@ -7,7 +7,7 @@ #include -namespace core { +namespace share_data { bool FunctionHolder::rawCompare(const BaseHolder* other) const noexcept { return function_ == static_cast(other)->function_; @@ -79,4 +79,4 @@ bool StoredObject::operator<(const StoredObject& o) const noexcept { return data_.get() < o.data_.get(); } -} // core +} diff --git a/src/stored-object.h b/src/stored-object.h index 60bc5a4..be2ff09 100644 --- a/src/stored-object.h +++ b/src/stored-object.h @@ -5,7 +5,7 @@ #include #include -namespace core { +namespace share_data { #define ERROR std::cerr @@ -148,8 +148,8 @@ private: namespace std { template<> -struct hash { - std::size_t operator()(const core::StoredObject &object) const noexcept { +struct hash { + std::size_t operator()(const share_data::StoredObject &object) const noexcept { return object.hash(); } }; diff --git a/src/threading.cpp b/src/threading.cpp index 4f33a6c..0d91846 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -1,7 +1,8 @@ #include "threading.h" -LuaThread::LuaThread(const sol::function& function, const sol::variadic_args& args) noexcept -{ +namespace threading { + +LuaThread::LuaThread(const sol::function& function, const sol::variadic_args& args) noexcept{ // 1. Dump function to string sol::state_view lua(function.lua_state()); str_function_ = lua["string"]["dump"](function); @@ -13,8 +14,8 @@ LuaThread::LuaThread(const sol::function& function, const sol::variadic_args& ar sol::lib::base, sol::lib::string, sol::lib::package, sol::lib::io, sol::lib::os ); - auto thread_table = core::init_state(*p_state_); - (void)thread_table; + get_user_type(*p_state_); + share_data::SharedTable::get_user_type(*p_state_); // 3. Save parameters validate_args(args); @@ -34,7 +35,7 @@ void LuaThread::validate_args(const sol::variadic_args& args) noexcept const auto end = --args.end(); for(auto iter = args.begin(); iter != end; iter++) { - core::StoredObject store(iter->get()); + share_data::StoredObject store(iter->get()); arguments_.push_back(store.unpack(sol::this_state{p_state_->lua_state()})); } } @@ -64,3 +65,16 @@ std::string LuaThread::thread_id() noexcept ss << std::this_thread::get_id(); return ss.str(); } + +sol::object LuaThread::get_user_type(sol::state_view& lua) noexcept +{ + static sol::usertype type( + sol::call_construction(), sol::constructors>(), + "join", &LuaThread::join, + "thread_id", &LuaThread::thread_id + ); + sol::stack::push(lua, type); + return sol::stack::pop(lua); +} + +} diff --git a/src/threading.h b/src/threading.h index b0d1c62..54df6cc 100644 --- a/src/threading.h +++ b/src/threading.h @@ -7,13 +7,17 @@ #include "shared-table.h" +namespace threading { + class LuaThread { public: LuaThread(const sol::function& function, const sol::variadic_args& args) noexcept; virtual ~LuaThread() noexcept; void join() noexcept; + static std::string thread_id() noexcept; + static sol::object get_user_type(sol::state_view& lua) noexcept; private: void work() noexcept; @@ -24,3 +28,5 @@ private: std::shared_ptr p_thread_; std::vector arguments_; }; + +}