package com.limegroup.gnutella.connection;
/**
* Keeps track of sent/received messages & the amount that dropped.
*/
public class ConnectionStats {
/** The number of messages sent. This includeds messages that are dropped. */
private int _numMessagesSent;
/** The number of messages received. This includes messages that are spam. */
private int _numMessagesReceived;
/**
* The number of messages received on this connection either filtered out
* or dropped because we didn't know how to route them.
*/
private int _numReceivedMessagesDropped;
/**
* The number of messages I dropped because the
* output queue overflowed. This happens when the remote host
* cannot receive packets as quickly as I am trying to send them.
* No synchronization is necessary.
*/
private int _numSentMessagesDropped;
/**
* _lastSent/_lastSentDropped and _lastReceived/_lastRecvDropped the values
* of _numMessagesSent/_numSentMessagesDropped and
* _numMessagesReceived/_numReceivedMessagesDropped at the last call to
* getPercentDropped. LOCKING: These are synchronized by this;
* finer-grained schemes could be used.
*/
private int _lastReceived;
private int _lastRecvDropped;
private int _lastSent;
private int _lastSentDropped;
// Getters.
public int getSent() { return _numMessagesSent; }
public int getReceived() { return _numMessagesReceived; }
public int getSentDropped() { return _numSentMessagesDropped; }
public int getReceivedDropped() { return _numReceivedMessagesDropped; }
/** Adds a number of dropped sent messages */
public void addSentDropped(int dropped) {
_numSentMessagesDropped += dropped;
}
/** Adds a sent message */
public void addSent() {
_numMessagesSent++;
}
/** Increments the number of received messages that have been dropped. */
public void addReceivedDropped() {
_numReceivedMessagesDropped++;
}
/** Increments the stat for the number of messages received. */
public void addReceived() {
_numMessagesReceived++;
}
/**
* @modifies this
* @effects Returns the percentage of messages sent on this
* since the last call to getPercentReceivedDropped that were
* dropped by this end of the connection.
*/
public synchronized float getPercentReceivedDropped() {
int rdiff = _numMessagesReceived - _lastReceived;
int ddiff = _numReceivedMessagesDropped - _lastRecvDropped;
float percent=(rdiff==0) ? 0.f : ((float)ddiff/(float)rdiff*100.f);
_lastReceived = _numMessagesReceived;
_lastRecvDropped = _numReceivedMessagesDropped;
return percent;
}
/**
* @modifies this
* @effects Returns the percentage of messages sent on this
* since the last call to getPercentSentDropped that were
* dropped by this end of the connection. This value may be
* greater than 100%, e.g., if only one message is sent but
* four are dropped during a given time period.
*/
public synchronized float getPercentSentDropped() {
int rdiff = _numMessagesSent - _lastSent;
int ddiff = _numSentMessagesDropped - _lastSentDropped;
float percent=(rdiff==0) ? 0.f : ((float)ddiff/(float)rdiff*100.f);
_lastSent = _numMessagesSent;
_lastSentDropped = _numSentMessagesDropped;
return percent;
}
}