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()});
}