diff --git a/src/java/com/threerings/presents/client/BlockingCommunicator.java b/src/java/com/threerings/presents/client/BlockingCommunicator.java index 22d502dd2..6ece46408 100644 --- a/src/java/com/threerings/presents/client/BlockingCommunicator.java +++ b/src/java/com/threerings/presents/client/BlockingCommunicator.java @@ -470,7 +470,7 @@ public class BlockingCommunicator extends Communicator if (debugLogMessages()) { log.info("RECEIVE " + msg); } - _client.getMessageTracker().messageReceived(false, size, msg); + _client.getMessageTracker().messageReceived(false, size, msg, 0); return msg; } catch (ClassNotFoundException cnfe) { @@ -496,15 +496,16 @@ public class BlockingCommunicator extends Communicator // decode through the sequencer try { DownstreamMessage msg = (DownstreamMessage)_sequencer.readDatagram(); + if (_client != null) { + _client.getMessageTracker().messageReceived( + true, size, msg, (msg == null) ? 0 : _sequencer.getMissedCount()); + } if (msg == null) { return null; // received out of order } if (debugLogMessages()) { log.info("DATAGRAM " + msg); } - if (_client != null) { - _client.getMessageTracker().messageReceived(true, size, msg); - } return msg; } catch (ClassNotFoundException cnfe) { diff --git a/src/java/com/threerings/presents/client/MessageTracker.java b/src/java/com/threerings/presents/client/MessageTracker.java index 8de489a03..310124d36 100644 --- a/src/java/com/threerings/presents/client/MessageTracker.java +++ b/src/java/com/threerings/presents/client/MessageTracker.java @@ -36,7 +36,8 @@ public interface MessageTracker public static final MessageTracker NOOP = new MessageTracker() { public void messageSent (boolean datagram, int size, UpstreamMessage msg) { } - public void messageReceived (boolean datagram, int size, DownstreamMessage msg) { + public void messageReceived ( + boolean datagram, int size, DownstreamMessage msg, int missed) { } }; @@ -47,6 +48,9 @@ public interface MessageTracker /** * Notes that a message has been received. + * + * @param msg the received message, or null if received out of order. + * @param missed the number of messages missed between this message and the one before it. */ - public void messageReceived (boolean datagram, int size, DownstreamMessage msg); + public void messageReceived (boolean datagram, int size, DownstreamMessage msg, int missed); } diff --git a/src/java/com/threerings/presents/util/DatagramSequencer.java b/src/java/com/threerings/presents/util/DatagramSequencer.java index 0442261bc..c5c1d0349 100644 --- a/src/java/com/threerings/presents/util/DatagramSequencer.java +++ b/src/java/com/threerings/presents/util/DatagramSequencer.java @@ -102,6 +102,7 @@ public class DatagramSequencer if (number <= _lastReceived) { return null; } + _missedCount = number - _lastReceived - 1; _lastReceived = number; // read the acknowledge number and process all send records up to that one @@ -132,6 +133,14 @@ public class DatagramSequencer return datagram; } + /** + * Returns the number of datagrams missed between the last and the one before it. + */ + public int getMissedCount () + { + return _missedCount; + } + /** * A record of a sent datagram. */ @@ -168,6 +177,9 @@ public class DatagramSequencer /** The most recent sequence number received. */ protected int _lastReceived; + /** The number of datagrams missed between the last and the one before it. */ + protected int _missedCount; + /** Records of datagrams sent. */ protected ArrayList _sendrecs = Lists.newArrayList(); }