core/sessionmanager.lua

changeset 53
14ea0fe6ca86
parent 49
1cd2a8db392d
child 57
126b25079399
--- a/core/sessionmanager.lua	Sat Oct 04 15:24:52 2008 +0100
+++ b/core/sessionmanager.lua	Sat Oct 04 15:25:54 2008 +0100
@@ -1,26 +1,62 @@
 
 local tonumber, tostring = tonumber, tostring;
-local ipairs, print= ipairs, print;
-
+local ipairs, pairs, print= ipairs, pairs, print;
+local collectgarbage = collectgarbage;
 local m_random = import("math", "random");
 local format = import("string", "format");
 
 local hosts = hosts;
+local sessions = sessions;
 
 local modulemanager = require "core.modulemanager";
 local log = require "util.logger".init("sessionmanager");
 local error = error;
 local uuid_generate = require "util.uuid".uuid_generate;
+
+local newproxy = newproxy;
+local getmetatable = getmetatable;
+
 module "sessionmanager"
 
 function new_session(conn)
 	local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" };
+	if true then
+		session.trace = newproxy(true);
+		getmetatable(session.trace).__gc = function () print("Session got collected") end;
+	end
 	local w = conn.write;
 	session.send = function (t) w(tostring(t)); end
 	return session;
 end
 
 function destroy_session(session)
+	if not (session and session.disconnect) then return; end 
+	log("debug", "Destroying session...");
+	session.disconnect();
+	if session.username then
+		if session.resource then
+			hosts[session.host].sessions[session.username].sessions[session.resource] = nil;
+		end
+		local nomore = true;
+		for res, ssn in pairs(hosts[session.host].sessions[session.username]) do
+			nomore = false;
+		end
+		if nomore then
+			hosts[session.host].sessions[session.username] = nil;
+		end
+	end
+	session.conn = nil;
+	session.disconnect = nil;
+	for k in pairs(session) do
+		if k ~= "trace" then
+			session[k] = nil;
+		end
+	end
+	collectgarbage("collect");
+	collectgarbage("collect");
+	collectgarbage("collect");
+	collectgarbage("collect");
+	collectgarbage("collect");
 end
 
 function send_to_session(session, data)
@@ -34,6 +70,7 @@
 	if session.type == "c2s_unauthed" then
 		session.type = "c2s";
 	end
+	return true;
 end
 
 function bind_resource(session, resource)

mercurial