package org.limewire.http.reactor; /** * A simple implementation of the BandwidthTracker interface. */ // TODO duplicates SimpleBandwidthTracker public class HttpBandwidthTracker { private static final int DEFAULT_INTERVAL = 500; private final int _interval; private long _lastAmount = 0; private long _lastTimeMeasured = 0; private long _firstTimeMeasured = 0; private long _amount = 0; private float _measuredBandwidth = -1f; public HttpBandwidthTracker() { this(DEFAULT_INTERVAL); } public HttpBandwidthTracker(int interval) { _interval = interval; } /** * Adds the given amount to the tracked bandwidth usage since the last time * measureBandwidth was called. * @param added non negative value to count towards bandwidth * @throws IllegalArgumentException if value supplied is < 0 */ public synchronized void count(int added) { if( added < 0) { throw new IllegalArgumentException("Count values must be positive: " + added); } startCounting(-1); _amount += added; } private void startCounting(long now) { if (_firstTimeMeasured == 0) { if (now == -1) now = System.currentTimeMillis(); _firstTimeMeasured = now; _lastTimeMeasured = _firstTimeMeasured; } } public synchronized long getTotalAmount() { return _amount; } public synchronized void measureBandwidth() { long now = System.currentTimeMillis(); startCounting(now); if (now - _lastTimeMeasured < _interval) return; _measuredBandwidth = (_amount - _lastAmount) / (now - _lastTimeMeasured); _lastAmount = _amount; _lastTimeMeasured = now; } public synchronized float getMeasuredBandwidth() { if (_measuredBandwidth < 0) return 0; return _measuredBandwidth; } public synchronized float getAverageBandwidth() { long time = System.currentTimeMillis() - _firstTimeMeasured; return time <= 0 ? 0 : _amount / time; } }