Software /
code /
prosody
Comparison
core/sessionmanager.lua @ 123:ebd65feb188c
Fix for not destroying sessions when connection closed.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Thu, 23 Oct 2008 16:07:40 +0100 |
parent | 118:76ac96c53ee5 |
child | 124:7fee6b63abca |
comparison
equal
deleted
inserted
replaced
122:21f8d2175393 | 123:ebd65feb188c |
---|---|
17 local newproxy = newproxy; | 17 local newproxy = newproxy; |
18 local getmetatable = getmetatable; | 18 local getmetatable = getmetatable; |
19 | 19 |
20 module "sessionmanager" | 20 module "sessionmanager" |
21 | 21 |
22 local open_sessions = 0; | |
23 | |
22 function new_session(conn) | 24 function new_session(conn) |
23 local session = { conn = conn, priority = 0, type = "c2s_unauthed" }; | 25 local session = { conn = conn, priority = 0, type = "c2s_unauthed" }; |
24 if true then | 26 if true then |
25 session.trace = newproxy(true); | 27 session.trace = newproxy(true); |
26 getmetatable(session.trace).__gc = function () print("Session got collected") end; | 28 getmetatable(session.trace).__gc = function () open_sessions = open_sessions - 1; print("Session got collected, now "..open_sessions.." sessions are allocated") end; |
27 end | 29 end |
30 open_sessions = open_sessions + 1; | |
28 local w = conn.write; | 31 local w = conn.write; |
29 session.send = function (t) w(tostring(t)); end | 32 session.send = function (t) w(tostring(t)); end |
30 return session; | 33 return session; |
31 end | 34 end |
32 | 35 |
33 function destroy_session(session) | 36 function destroy_session(session) |
34 if not (session and session.disconnect) then return; end | 37 session.log("info", "Destroying session"); |
35 log("debug", "Destroying session..."); | |
36 session.disconnect(); | |
37 if session.username then | 38 if session.username then |
38 if session.resource then | 39 if session.resource then |
39 hosts[session.host].sessions[session.username].sessions[session.resource] = nil; | 40 hosts[session.host].sessions[session.username].sessions[session.resource] = nil; |
40 end | 41 end |
41 local nomore = true; | 42 local nomore = true; |
51 for k in pairs(session) do | 52 for k in pairs(session) do |
52 if k ~= "trace" then | 53 if k ~= "trace" then |
53 session[k] = nil; | 54 session[k] = nil; |
54 end | 55 end |
55 end | 56 end |
56 collectgarbage("collect"); | |
57 collectgarbage("collect"); | |
58 collectgarbage("collect"); | |
59 collectgarbage("collect"); | |
60 collectgarbage("collect"); | |
61 end | 57 end |
62 | 58 |
63 function send_to_session(session, data) | 59 function send_to_session(session, data) |
64 log("debug", "Sending: %s", tostring(data)); | 60 log("debug", "Sending: %s", tostring(data)); |
65 session.conn.write(tostring(data)); | 61 session.conn.write(tostring(data)); |