1
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "define.h"
|
||||
#include "base/error.h"
|
||||
#include "util/map.hpp"
|
||||
#include "util/queue.hpp"
|
||||
namespace fastweb
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user