diff --git a/src/core/global.cpp b/src/core/global.cpp index 90394ab..2c7e098 100644 --- a/src/core/global.cpp +++ b/src/core/global.cpp @@ -65,7 +65,6 @@ void fastweb::global::set_str(const std::string& name, std::string value) { m_values.set(name, value, true); } - void fastweb::global::clear() { //for_iter(iter, (*m_ptrs.parent())) @@ -75,4 +74,4 @@ void fastweb::global::clear() //} m_ptrs.clear(); m_values.clear(); -} +} \ No newline at end of file diff --git a/src/core/global.h b/src/core/global.h index d1abc8a..0805761 100644 --- a/src/core/global.h +++ b/src/core/global.h @@ -2,6 +2,7 @@ #include "define.h" #include "base/error.h" #include "util/map.hpp" +#include "util/queue.hpp" namespace fastweb { /// diff --git a/src/core/interceptormanager.cpp b/src/core/interceptormanager.cpp index 5294ebb..2d1ba7a 100644 --- a/src/core/interceptormanager.cpp +++ b/src/core/interceptormanager.cpp @@ -22,6 +22,7 @@ If you have any questions, please contact us: 1585346868@qq.com Or visit our web #include "module/http/request.h" #include "module/http/response.h" #include "net/http_interceptor.h" +#include "module/request_temp_ptr.h" fastweb::interceptor_manager::interceptor_manager(fastweb::app* app):Interface(app) { } @@ -69,9 +70,10 @@ bool fastweb::interceptor_manager::callback(network::http::reqpack* reqpack, con } module::request m_request(reqpack->request().get()); module::response m_response(reqpack->response().get()); + module::request_temp_ptr fw_request_temp_ptr; (*lua->state)["fw_response"] = m_response; (*lua->state)["fw_request"] = m_request; - + (*lua->state)["fw_request_temp_ptr"] = fw_request_temp_ptr; sol::protected_function_result result = script(); if (!result.valid()) { sol::error err = result; diff --git a/src/core/modulemanager.cpp b/src/core/modulemanager.cpp index 23776f4..b3f7ee8 100644 --- a/src/core/modulemanager.cpp +++ b/src/core/modulemanager.cpp @@ -39,6 +39,8 @@ If you have any questions, please contact us: 1585346868@qq.com Or visit our web #include "module/ini.h" #include "module/codec.h" #include "module/queue.h" +#include "module/request_temp_ptr.h" + fastweb::module_manager::module_manager(fastweb::app* app):Interface(app) { } @@ -205,7 +207,7 @@ void fastweb::module_manager::load_core(sol::state* lua) module::ini::regist(lua); module::codec::regist(lua); module::queue::regist(lua); - + module::request_temp_ptr::regist(lua); app()->global->regist(lua); } diff --git a/src/core/subscribemanager.cpp b/src/core/subscribemanager.cpp index 29f5e5b..a0c8e1c 100644 --- a/src/core/subscribemanager.cpp +++ b/src/core/subscribemanager.cpp @@ -63,11 +63,8 @@ bool fastweb::subscribe_manager::callback(network::http::request* request, netwo bool ok_continue = false; auto lua = app()->state->get(); std::string exception_string; - - // 临时指针管理(待释放资源) - module::request_temp_ptr request_temp_ptr; try - { + { sol::load_result script = lua->state->load_file(app()->config->website.dir + filepath); if (!script.valid()) { sol::error err = script; @@ -75,8 +72,10 @@ bool fastweb::subscribe_manager::callback(network::http::request* request, netwo } module::request m_request(request); module::response m_response(response); + module::request_temp_ptr fw_request_temp_ptr; (*lua->state)["fw_response"] = m_response; (*lua->state)["fw_request"] = m_request; + (*lua->state)["fw_request_temp_ptr"] = fw_request_temp_ptr; sol::protected_function_result result = script(); if (!result.valid()) { @@ -90,8 +89,6 @@ bool fastweb::subscribe_manager::callback(network::http::request* request, netwo if (app()->config->website.debug) LOG_ERROR("[subscribe][" + request->filepath() + "]: " + e.what()); } - // 释放临时指针 - request_temp_ptr.clear(); // 释放lua资源 lua->state->collect_garbage(); app()->state->push(lua); diff --git a/src/module/request_temp_ptr.cpp b/src/module/request_temp_ptr.cpp index 6e5b90a..7047e66 100644 --- a/src/module/request_temp_ptr.cpp +++ b/src/module/request_temp_ptr.cpp @@ -16,32 +16,83 @@ If you have any questions, please contact us: 1585346868@qq.com Or visit our web */ #include "request_temp_ptr.h" +namespace { +const char kModuleBaseRegKey[] = "fastweb_fw_module_base_usertype"; +} + +void module::request_temp_ptr::push_from_lua(request_temp_ptr& self, sol::object arg, sol::this_state s) +{ + lua_State* L = s.lua_state(); + arg.push(); + const int idx = lua_absindex(L, -1); + + const sol::type ty = sol::type_of(L, idx); + module::base* base = nullptr; + + if (ty == sol::type::lightuserdata) { + base = static_cast(lua_touserdata(L, idx)); + lua_pop(L, 1); + } + else if (ty == sol::type::userdata) { + sol::stack::record tracking{}; + auto maybe = sol::stack::check_get(L, idx, &sol::no_panic, tracking); + lua_pop(L, 1); + if (maybe) { + base = *maybe; + } + else { + luaL_error(L, "fw_request_temp_ptr.push: full userdata is not a module::base* " + "(use conn:self() for light pointer, or register your type with sol::bases)"); + return; + } + } + else { + lua_pop(L, 1); + luaL_error(L, "fw_request_temp_ptr.push: expected lightuserdata (e.g. obj:self()) or userdata"); + return; + } + + if (base == nullptr) { + luaL_error(L, "fw_request_temp_ptr.push: null pointer"); + return; + } + + self.m_queue.push(base); +} + module::request_temp_ptr::request_temp_ptr() { } module::request_temp_ptr::~request_temp_ptr() { + clear(); } -void module::request_temp_ptr::push(void* value) -{ - m_queue.push(value); -} void module::request_temp_ptr::clear() { while (m_queue.size() > 0) { - auto base = (module::base*)m_queue.front(); + module::base* base = m_queue.front(); m_queue.pop(); base->self_free(); } } void module::request_temp_ptr::regist(sol::state* lua) { + lua_State* L = lua->lua_state(); + if (lua_getfield(L, LUA_REGISTRYINDEX, kModuleBaseRegKey) == LUA_TNIL) { + lua_pop(L, 1); + lua->new_usertype("fw_module_base", sol::no_constructor); + lua_pushboolean(L, 1); + lua_setfield(L, LUA_REGISTRYINDEX, kModuleBaseRegKey); + } + else { + lua_pop(L, 1); + } + lua->new_usertype("fw_request_temp_ptr", - "new", sol::constructors(), - "push", &module::request_temp_ptr::push, - "clear", &module::request_temp_ptr::clear + "push", &module::request_temp_ptr::push_from_lua ); -} \ No newline at end of file +} + \ No newline at end of file diff --git a/src/module/request_temp_ptr.h b/src/module/request_temp_ptr.h index de40485..e484c65 100644 --- a/src/module/request_temp_ptr.h +++ b/src/module/request_temp_ptr.h @@ -10,12 +10,12 @@ namespace module ~request_temp_ptr(); - void push(void* value); void clear(); static void regist(sol::state* lua); private: - std::queue m_queue; + static void push_from_lua(request_temp_ptr& self, sol::object arg, sol::this_state s); + std::queue m_queue; }; }