a158 4 ماه پیش
والد
کامیت
2cafe7dc1e

+ 1 - 2
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();
-}
+}

+ 1 - 0
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
 {
 	/// <summary>

+ 3 - 1
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;

+ 3 - 1
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);
 
 }

+ 3 - 6
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);

+ 60 - 9
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"
 
-module::request_temp_ptr::request_temp_ptr()
+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()
 {
 }
 
-void module::request_temp_ptr::push(void* value)
+module::request_temp_ptr::~request_temp_ptr()
 {
-	m_queue.push(value);
+    clear();
 }
+
 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
     );
-}
+}
+ 

+ 2 - 2
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<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;
 	};
 
 }