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;