# HG changeset patch # User Matthew Wild # Date 1224774460 -3600 # Node ID ebd65feb188cde6ce709c80858d090bcf7838ab8 # Parent 21f8d21753937695d7f7104b46d1f2e174a30b46 Fix for not destroying sessions when connection closed. diff -r 21f8d2175393 -r ebd65feb188c core/sessionmanager.lua --- a/core/sessionmanager.lua Thu Oct 23 14:39:42 2008 +0100 +++ b/core/sessionmanager.lua Thu Oct 23 16:07:40 2008 +0100 @@ -19,21 +19,22 @@ module "sessionmanager" +local open_sessions = 0; + function new_session(conn) local session = { conn = conn, priority = 0, type = "c2s_unauthed" }; if true then session.trace = newproxy(true); - getmetatable(session.trace).__gc = function () print("Session got collected") end; + getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; print("Session got collected, now "..open_sessions.." sessions are allocated") end; end + open_sessions = open_sessions + 1; 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(); + session.log("info", "Destroying session"); if session.username then if session.resource then hosts[session.host].sessions[session.username].sessions[session.resource] = nil; @@ -53,11 +54,6 @@ session[k] = nil; end end - collectgarbage("collect"); - collectgarbage("collect"); - collectgarbage("collect"); - collectgarbage("collect"); - collectgarbage("collect"); end function send_to_session(session, data) diff -r 21f8d2175393 -r ebd65feb188c net/xmppclient_listener.lua --- a/net/xmppclient_listener.lua Thu Oct 23 14:39:42 2008 +0100 +++ b/net/xmppclient_listener.lua Thu Oct 23 16:07:40 2008 +0100 @@ -69,6 +69,19 @@ end function xmppclient.disconnect(conn) + local session = sessions[conn]; + if session then + if session.last_presence and session.last_presence.attr.type ~= "unavailable" then + local pres = st.presence{ type = "unavailable" }; + if err == "closed" then err = "connection closed"; end + pres:tag("status"):text("Disconnected: "..err); + session.stanza_dispatch(pres); + end + sm_destroy_session(session); + sessions[conn] = nil; + session = nil; + collectgarbage("collect"); + end end connlisteners_register("xmppclient", xmppclient);