diff --git a/webui/src/main/java/com/muwire/webui/UploadManager.java b/webui/src/main/java/com/muwire/webui/UploadManager.java index e7692304..bea81aeb 100644 --- a/webui/src/main/java/com/muwire/webui/UploadManager.java +++ b/webui/src/main/java/com/muwire/webui/UploadManager.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; import com.muwire.core.Core; import com.muwire.core.upload.UploadEvent; @@ -69,11 +68,15 @@ public class UploadManager { } } - public static class UploaderWrapper { + public class UploaderWrapper { private volatile Uploader uploader; private volatile int requests; private volatile boolean finished; + private volatile int[] speedArray = new int[0]; + private volatile int speedPos; + private volatile long lastSpeedRead = System.currentTimeMillis(); + public Uploader getUploader() { return uploader; } @@ -85,5 +88,33 @@ public class UploadManager { public boolean isFinished() { return finished; } + + public int speed() { + + if (speedArray.length != core.getMuOptions().getSpeedSmoothSeconds()) { + speedArray = new int[core.getMuOptions().getSpeedSmoothSeconds()]; + speedPos = 0; + } + + final long now = System.currentTimeMillis(); + if (now < lastSpeedRead + 50) + return speedAverage(); + + int read = uploader.dataSinceLastRead(); + int speed = (int) (1000.0d * read / (now - lastSpeedRead)); + lastSpeedRead = now; + + speedArray[speedPos++] = speed; + if (speedPos == speedArray.length) + speedPos = 0; + return speedAverage(); + } + + private int speedAverage() { + int total = 0; + for (int reading : speedArray) + total += reading; + return total / speedArray.length; + } } } diff --git a/webui/src/main/java/com/muwire/webui/UploadServlet.java b/webui/src/main/java/com/muwire/webui/UploadServlet.java index 108e737e..0488a470 100644 --- a/webui/src/main/java/com/muwire/webui/UploadServlet.java +++ b/webui/src/main/java/com/muwire/webui/UploadServlet.java @@ -36,7 +36,7 @@ public class UploadServlet extends HttpServlet { wrapper.getUploader().getDownloaderPersona().toBase64(), wrapper.getUploader().getDonePieces(), wrapper.getUploader().getTotalPieces(), - wrapper.getUploader().speed(), + wrapper.speed(), wrapper.getUploader().isBrowseEnabled(), wrapper.getUploader().isFeedEnabled(), browseManager.isBrowsing(downloader),