This commit is contained in:
a158
2026-05-08 01:41:12 +08:00
parent 897cf54c9f
commit eb42687610
7 changed files with 73 additions and 21 deletions

View File

@@ -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();
}
}

View File

@@ -2,6 +2,7 @@
#include "define.h"
#include "base/error.h"
#include "util/map.hpp"
#include "util/queue.hpp"
namespace fastweb
{
/// <summary>

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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<module::base*>(lua_touserdata(L, idx));
lua_pop(L, 1);
}
else if (ty == sol::type::userdata) {
sol::stack::record tracking{};
auto maybe = sol::stack::check_get<module::base*>(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<module::base>)");
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<module::base>("fw_module_base", sol::no_constructor);
lua_pushboolean(L, 1);
lua_setfield(L, LUA_REGISTRYINDEX, kModuleBaseRegKey);
}
else {
lua_pop(L, 1);
}
lua->new_usertype<module::request_temp_ptr>("fw_request_temp_ptr",
"new", sol::constructors<module::request_temp_ptr()>(),
"push", &module::request_temp_ptr::push,
"clear", &module::request_temp_ptr::clear
"push", &module::request_temp_ptr::push_from_lua
);
}
}

View File

@@ -10,12 +10,12 @@ namespace module
~request_temp_ptr();
void push(void* value);
void clear();
static void regist(sol::state* lua);
private:
std::queue<void*> m_queue;
static void push_from_lua(request_temp_ptr& self, sol::object arg, sol::this_state s);
std::queue<module::base*> m_queue;
};
}