diff --git a/pom.xml b/pom.xml index 59b8d6d27..49f25bed2 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 5.70 + 5.71 jar diff --git a/src/main/java/com/tonikelope/megabasterd/DownloadManager.java b/src/main/java/com/tonikelope/megabasterd/DownloadManager.java index d26719c26..dd27665ce 100644 --- a/src/main/java/com/tonikelope/megabasterd/DownloadManager.java +++ b/src/main/java/com/tonikelope/megabasterd/DownloadManager.java @@ -44,7 +44,7 @@ public final class DownloadManager extends TransferenceManager { if (((Download) d).isProvision_ok()) { - _total_transferences_size -= d.getFile_size(); + increment_total_size(-1 * d.getFile_size()); delete_down.add(((Download) d).getUrl()); } @@ -106,7 +106,7 @@ public final class DownloadManager extends TransferenceManager { if (download.isProvision_ok()) { - _total_transferences_size += download.getFile_size(); + increment_total_size(download.getFile_size()); getTransference_waitstart_queue().add(download); diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index f0c0a83bf..94c2ab84c 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -48,7 +48,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "5.70"; + public static final String VERSION = "5.71"; public static final int THROTTLE_SLICE_SIZE = 16 * 1024; public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024; public static final int STREAMER_PORT = 1337; diff --git a/src/main/java/com/tonikelope/megabasterd/SpeedMeter.java b/src/main/java/com/tonikelope/megabasterd/SpeedMeter.java index f0018e1f1..ced85a468 100644 --- a/src/main/java/com/tonikelope/megabasterd/SpeedMeter.java +++ b/src/main/java/com/tonikelope/megabasterd/SpeedMeter.java @@ -23,6 +23,7 @@ public final class SpeedMeter implements Runnable { private long _speed_counter; private long _speed_acumulator; private volatile long _max_avg_global_speed; + private final Object _speed_lock; SpeedMeter(TransferenceManager trans_manager, JLabel sp_label, JLabel rem_label) { _speed_label = sp_label; @@ -32,6 +33,7 @@ public final class SpeedMeter implements Runnable { _speed_counter = 0L; _speed_acumulator = 0L; _max_avg_global_speed = 0L; + _speed_lock = new Object(); } private long _getAvgGlobalSpeed() { @@ -40,19 +42,26 @@ public final class SpeedMeter implements Runnable { public void attachTransference(Transference transference) { - HashMap properties = new HashMap<>(); + synchronized (_speed_lock) { - properties.put("last_progress", transference.getProgress()); - properties.put("no_data_count", 0); + HashMap properties = new HashMap<>(); - _transferences.put(transference, properties); + properties.put("last_progress", transference.getProgress()); + properties.put("no_data_count", 0); + _transferences.put(transference, properties); + + } } public void detachTransference(Transference transference) { - if (_transferences.containsKey(transference)) { - _transferences.remove(transference); + synchronized (_speed_lock) { + + if (_transferences.containsKey(transference)) { + _transferences.remove(transference); + } + } } @@ -125,7 +134,7 @@ public final class SpeedMeter implements Runnable { @Override public void run() { - long global_speed, global_progress; + long global_speed, global_progress, global_size; boolean visible = false; _speed_label.setVisible(true); @@ -137,73 +146,79 @@ public final class SpeedMeter implements Runnable { try { - if (!_transferences.isEmpty()) { + synchronized (_speed_lock) { - visible = true; + if (!_transferences.isEmpty()) { - global_speed = 0L; + visible = true; - global_progress = 0L; + global_speed = 0L; - for (Map.Entry trans_info : _transferences.entrySet()) { + global_progress = 0L; - long trans_sp = calcTransferenceSpeed(trans_info.getKey(), trans_info.getValue()); + global_size = _trans_manager.get_total_size(); - if (trans_sp >= 0) { - global_speed += trans_sp; + for (Map.Entry trans_info : _transferences.entrySet()) { + + long trans_sp = calcTransferenceSpeed(trans_info.getKey(), trans_info.getValue()); + + if (trans_sp >= 0) { + global_speed += trans_sp; + } + + global_progress += trans_info.getKey().getProgress(); + + if (trans_sp > 0) { + + trans_info.getKey().getView().updateSpeed(formatBytes(trans_sp) + "/s", true); + + } else if (trans_sp == 0) { + + trans_info.getKey().getView().updateSpeed("------", true); + + } else { + + trans_info.getKey().getView().updateSpeed("BANDWIDTH LIMIT ERROR!", true); + } } - global_progress += trans_info.getKey().getProgress(); + for (Transference transference : _trans_manager.getTransference_finished_queue()) { - if (trans_sp > 0) { + if (!transference.isStatusError()) { - trans_info.getKey().getView().updateSpeed(formatBytes(trans_sp) + "/s", true); + global_progress += transference.getProgress(); + } + } - } else if (trans_sp == 0) { + if (global_speed > 0) { - trans_info.getKey().getView().updateSpeed("------", true); + _speed_counter++; + _speed_acumulator += global_speed; + + long avg_global_speed = _getAvgGlobalSpeed(); + + if (avg_global_speed > _max_avg_global_speed) { + _max_avg_global_speed = avg_global_speed; + } + + _speed_label.setText(formatBytes(global_speed) + "/s"); + + _rem_label.setText(formatBytes(global_progress) + "/" + formatBytes(global_size) + " @ " + formatBytes(avg_global_speed) + "/s @ " + calcRemTime((long) Math.floor((global_size - global_progress) / avg_global_speed))); } else { - trans_info.getKey().getView().updateSpeed("BANDWIDTH LIMIT ERROR!", true); - } - } + _speed_label.setText("------"); + _rem_label.setText(formatBytes(global_progress) + "/" + formatBytes(global_size) + " @ --d --:--:--"); - for (Transference transference : _trans_manager.getTransference_finished_queue()) { - - if (!transference.isStatusError()) { - - global_progress += transference.getProgress(); - } - } - - if (global_speed > 0) { - - _speed_counter++; - _speed_acumulator += global_speed; - - long avg_global_speed = _getAvgGlobalSpeed(); - - if (avg_global_speed > _max_avg_global_speed) { - _max_avg_global_speed = avg_global_speed; } - _speed_label.setText(formatBytes(global_speed) + "/s"); - - _rem_label.setText(formatBytes(global_progress) + "/" + formatBytes(_trans_manager.getTotal_transferences_size()) + " @ " + formatBytes(avg_global_speed) + "/s @ " + calcRemTime((long) Math.floor((_trans_manager.getTotal_transferences_size() - global_progress) / avg_global_speed))); - - } else { - - _speed_label.setText("------"); - _rem_label.setText(formatBytes(global_progress) + "/" + formatBytes(_trans_manager.getTotal_transferences_size()) + " @ --d --:--:--"); + } else if (visible) { + _speed_label.setText(""); + _rem_label.setText(""); + visible = false; } - } else if (visible) { - - _speed_label.setText(""); - _rem_label.setText(""); - visible = false; } Thread.sleep(SLEEP); diff --git a/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java b/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java index b1e03b9fc..a2df625b1 100644 --- a/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java +++ b/src/main/java/com/tonikelope/megabasterd/TransferenceManager.java @@ -42,7 +42,8 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea private volatile boolean _preprocessing_transferences; private volatile boolean _paused_all; private boolean _tray_icon_finish; - protected long _total_transferences_size; + protected volatile long _total_size; + protected final Object _total_size_lock; public TransferenceManager(MainPanel main_panel, int max_running_trans, javax.swing.JLabel status, javax.swing.JPanel scroll_panel, javax.swing.JButton close_all_button, javax.swing.JButton pause_all_button, javax.swing.MenuElement clean_all_menu) { _notified = false; @@ -59,8 +60,9 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea _close_all_button = close_all_button; _pause_all_button = pause_all_button; _clean_all_menu = clean_all_menu; - _total_transferences_size = 0L; + _total_size = 0L; _secure_notify_lock = new Object(); + _total_size_lock = new Object(); _queue_sort_lock = new Object(); _transference_preprocess_global_queue = new ConcurrentLinkedQueue<>(); _transference_waitstart_queue = new ConcurrentLinkedQueue<>(); @@ -96,8 +98,20 @@ abstract public class TransferenceManager implements Runnable, SecureSingleThrea _removing_transferences = removing; } - public long getTotal_transferences_size() { - return _total_transferences_size; + public long get_total_size() { + + synchronized (_total_size_lock) { + return _total_size; + } + } + + public void increment_total_size(long val) { + + synchronized (_total_size_lock) { + + _total_size += val; + } + } public boolean isProvisioning_transferences() { diff --git a/src/main/java/com/tonikelope/megabasterd/UploadManager.java b/src/main/java/com/tonikelope/megabasterd/UploadManager.java index 4cf54b9a7..cf32e2c3d 100644 --- a/src/main/java/com/tonikelope/megabasterd/UploadManager.java +++ b/src/main/java/com/tonikelope/megabasterd/UploadManager.java @@ -40,7 +40,7 @@ public final class UploadManager extends TransferenceManager { if (((Upload) upload).isProvision_ok()) { - _total_transferences_size += upload.getFile_size(); + increment_total_size(upload.getFile_size()); getTransference_waitstart_queue().add(upload); @@ -102,7 +102,7 @@ public final class UploadManager extends TransferenceManager { getTransference_finished_queue().remove(u); - _total_transferences_size -= u.getFile_size(); + increment_total_size(-1 * u.getFile_size()); delete_up.add(new String[]{u.getFile_name(), ((Upload) u).getMa().getFull_email()}); }