Mercurial > prosody-hg
comparison core/sessionmanager.lua @ 53:14ea0fe6ca86
Session destruction fixes, some debugging code while we fix the rest. Also change logger to be more useful.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sat, 04 Oct 2008 15:25:54 +0100 |
| parents | 1cd2a8db392d |
| children | 126b25079399 |
comparison
equal
deleted
inserted
replaced
| 52:93e468eb2ffb | 53:14ea0fe6ca86 |
|---|---|
| 1 | 1 |
| 2 local tonumber, tostring = tonumber, tostring; | 2 local tonumber, tostring = tonumber, tostring; |
| 3 local ipairs, print= ipairs, print; | 3 local ipairs, pairs, print= ipairs, pairs, print; |
| 4 | 4 local collectgarbage = collectgarbage; |
| 5 local m_random = import("math", "random"); | 5 local m_random = import("math", "random"); |
| 6 local format = import("string", "format"); | 6 local format = import("string", "format"); |
| 7 | 7 |
| 8 local hosts = hosts; | 8 local hosts = hosts; |
| 9 local sessions = sessions; | |
| 9 | 10 |
| 10 local modulemanager = require "core.modulemanager"; | 11 local modulemanager = require "core.modulemanager"; |
| 11 local log = require "util.logger".init("sessionmanager"); | 12 local log = require "util.logger".init("sessionmanager"); |
| 12 local error = error; | 13 local error = error; |
| 13 local uuid_generate = require "util.uuid".uuid_generate; | 14 local uuid_generate = require "util.uuid".uuid_generate; |
| 15 | |
| 16 local newproxy = newproxy; | |
| 17 local getmetatable = getmetatable; | |
| 18 | |
| 14 module "sessionmanager" | 19 module "sessionmanager" |
| 15 | 20 |
| 16 function new_session(conn) | 21 function new_session(conn) |
| 17 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; | 22 local session = { conn = conn, notopen = true, priority = 0, type = "c2s_unauthed" }; |
| 23 if true then | |
| 24 session.trace = newproxy(true); | |
| 25 getmetatable(session.trace).__gc = function () print("Session got collected") end; | |
| 26 end | |
| 18 local w = conn.write; | 27 local w = conn.write; |
| 19 session.send = function (t) w(tostring(t)); end | 28 session.send = function (t) w(tostring(t)); end |
| 20 return session; | 29 return session; |
| 21 end | 30 end |
| 22 | 31 |
| 23 function destroy_session(session) | 32 function destroy_session(session) |
| 33 if not (session and session.disconnect) then return; end | |
| 34 log("debug", "Destroying session..."); | |
| 35 session.disconnect(); | |
| 36 if session.username then | |
| 37 if session.resource then | |
| 38 hosts[session.host].sessions[session.username].sessions[session.resource] = nil; | |
| 39 end | |
| 40 local nomore = true; | |
| 41 for res, ssn in pairs(hosts[session.host].sessions[session.username]) do | |
| 42 nomore = false; | |
| 43 end | |
| 44 if nomore then | |
| 45 hosts[session.host].sessions[session.username] = nil; | |
| 46 end | |
| 47 end | |
| 48 session.conn = nil; | |
| 49 session.disconnect = nil; | |
| 50 for k in pairs(session) do | |
| 51 if k ~= "trace" then | |
| 52 session[k] = nil; | |
| 53 end | |
| 54 end | |
| 55 collectgarbage("collect"); | |
| 56 collectgarbage("collect"); | |
| 57 collectgarbage("collect"); | |
| 58 collectgarbage("collect"); | |
| 59 collectgarbage("collect"); | |
| 24 end | 60 end |
| 25 | 61 |
| 26 function send_to_session(session, data) | 62 function send_to_session(session, data) |
| 27 log("debug", "Sending: %s", tostring(data)); | 63 log("debug", "Sending: %s", tostring(data)); |
| 28 session.conn.write(tostring(data)); | 64 session.conn.write(tostring(data)); |
| 32 session.username = username; | 68 session.username = username; |
| 33 session.resource = resource; | 69 session.resource = resource; |
| 34 if session.type == "c2s_unauthed" then | 70 if session.type == "c2s_unauthed" then |
| 35 session.type = "c2s"; | 71 session.type = "c2s"; |
| 36 end | 72 end |
| 73 return true; | |
| 37 end | 74 end |
| 38 | 75 |
| 39 function bind_resource(session, resource) | 76 function bind_resource(session, resource) |
| 40 if not session.username then return false, "auth"; end | 77 if not session.username then return false, "auth"; end |
| 41 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources | 78 if session.resource then return false, "constraint"; end -- We don't support binding multiple resources |
