From e01c8b0635248c6811c5d432d3cb3de5c2059d74 Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 18 Feb 2009 23:06:32 +0000 Subject: [PATCH] Separate the reporting of session end to observers from clearing out our internal bits. Only report that a session ended if we reported that it started, but always clear out our bits when a session is shutting down. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5659 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- .../presents/server/ClientManager.java | 40 +++++++++++-------- .../presents/server/PresentsSession.java | 8 +++- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/java/com/threerings/presents/server/ClientManager.java b/src/java/com/threerings/presents/server/ClientManager.java index 1a809257d..86df2df83 100644 --- a/src/java/com/threerings/presents/server/ClientManager.java +++ b/src/java/com/threerings/presents/server/ClientManager.java @@ -39,6 +39,7 @@ import com.samskivert.util.StringUtil; import com.threerings.util.Name; +import com.threerings.presents.annotation.EventThread; import com.threerings.presents.data.ClientObject; import com.threerings.presents.net.AuthRequest; import com.threerings.presents.net.AuthResponse; @@ -449,9 +450,9 @@ public class ClientManager } /** - * Called by the client instance when it has started its session. This is called from the - * dobjmgr thread. + * Called by PresentsSession when it has started its session. */ + @EventThread protected void clientSessionDidStart (final PresentsSession client) { // let the observers know @@ -464,10 +465,25 @@ public class ClientManager } /** - * Called by the client instance when the client requests a logoff. This is called from the - * dobjmgr thread. + * Called by PresentsSession when it has ended its session. */ + @EventThread protected void clientSessionDidEnd (final PresentsSession session) + { + // notify the observers that the session is ended + _clobservers.apply(new ObserverList.ObserverOp() { + public boolean apply (ClientObserver observer) { + observer.clientSessionDidEnd(session); + return true; + } + }); + } + + /** + * Called by PresentsSession to let us know that we can clear it entirely out of the system. + */ + @EventThread + protected void clearSession (PresentsSession session) { // remove the client from the username map Name username = session.getCredentials().getUsername(); @@ -479,22 +495,12 @@ public class ClientManager // sanity check just because we can if (rc == null) { - log.info("Ending session: unregistered!", "session", session); - + log.info("Cleared session: unregistered!", "session", session); } else if (rc != session) { - log.info("Ending session: multiple!", "s1", rc, "s2", session); - + log.info("Cleared session: multiple!", "s1", rc, "s2", session); } else { - log.info("Ending session", "session", session); + log.info("Cleared session", "session", session); } - - // notify the observers that the session is ended - _clobservers.apply(new ObserverList.ObserverOp() { - public boolean apply (ClientObserver observer) { - observer.clientSessionDidEnd(session); - return true; - } - }); } /** diff --git a/src/java/com/threerings/presents/server/PresentsSession.java b/src/java/com/threerings/presents/server/PresentsSession.java index 0b4d308a4..cbd15628d 100644 --- a/src/java/com/threerings/presents/server/PresentsSession.java +++ b/src/java/com/threerings/presents/server/PresentsSession.java @@ -338,10 +338,14 @@ public class PresentsSession // release (and destroy) our client object _clmgr.releaseClientObject(_username); + + // we only report that our session started if we managed to resolve our client object, + // so we only report that it ended in the same circumstance + _clmgr.clientSessionDidEnd(this); } - // let the client manager know that we're audi 5000 - _clmgr.clientSessionDidEnd(this); + // we always want to clear ourselves out of the client manager + _clmgr.clearSession(this); // clear out the client object so that we know the session is over _clobj = null;