Skip to content

Commit

Permalink
Using weak references for listeners.
Browse files Browse the repository at this point in the history
  • Loading branch information
aldenml committed Dec 7, 2015
1 parent 735b830 commit c8c918c
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 13 deletions.
38 changes: 25 additions & 13 deletions src/main/java/com/frostwire/jlibtorrent/Session.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
import com.frostwire.jlibtorrent.swig.session_handle.options_t;

import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

Expand Down Expand Up @@ -41,8 +43,8 @@ public final class Session extends SessionHandle {
private long lastStatsRequestTime;
private long lastStatSecondTick;

private final SparseArray<ArrayList<AlertListener>> listeners;
private final SparseArray<AlertListener[]> listenerSnapshots;
private final SparseArray<ArrayList<WeakReference<AlertListener>>> listeners;
private final SparseArray<WeakReference<AlertListener>[]> listenerSnapshots;
private boolean running;

private final LinkedList<SwigPlugin> plugins;
Expand All @@ -61,8 +63,8 @@ public Session(SettingsPack settings, boolean logging) {
this.stat = new JavaStat();
this.stats = new SessionStats(stat);

this.listeners = new SparseArray<ArrayList<AlertListener>>();
this.listenerSnapshots = new SparseArray<AlertListener[]>();
this.listeners = new SparseArray<ArrayList<WeakReference<AlertListener>>>();
this.listenerSnapshots = new SparseArray<WeakReference<AlertListener>[]>();
this.running = true;

alertsLoop();
Expand All @@ -83,8 +85,8 @@ public Session(Fingerprint print, Pair<Integer, Integer> prange, String iface, L
this.stat = new JavaStat();
this.stats = new SessionStats(stat);

this.listeners = new SparseArray<ArrayList<AlertListener>>();
this.listenerSnapshots = new SparseArray<AlertListener[]>();
this.listeners = new SparseArray<ArrayList<WeakReference<AlertListener>>>();
this.listenerSnapshots = new SparseArray<WeakReference<AlertListener>[]>();
this.running = true;

alertsLoop();
Expand Down Expand Up @@ -872,11 +874,14 @@ void fireAlert(Alert<?> a) {
}

private void fireAlert(Alert<?> a, int type) {
AlertListener[] listeners = listenerSnapshots.get(type);
WeakReference<AlertListener>[] listeners = listenerSnapshots.get(type);
if (listeners != null) {
for (int i = 0; i < listeners.length; i++) {
try {
listeners[i].alert(a);
AlertListener l = listeners[i].get();
if (l != null) {
l.alert(a);
}
} catch (Throwable e) {
LOG.warn("Error calling alert listener", e);
}
Expand Down Expand Up @@ -1006,20 +1011,27 @@ private void modifyListeners(boolean adding, AlertListener listener) {
}
}

@SuppressWarnings("unchecked")
private void modifyListeners(boolean adding, int type, AlertListener listener) {
ArrayList<AlertListener> l = listeners.get(type);
ArrayList<WeakReference<AlertListener>> l = listeners.get(type);
if (l == null) {
l = new ArrayList<AlertListener>();
l = new ArrayList<WeakReference<AlertListener>>();
listeners.append(type, l);
}

if (adding) {
l.add(listener);
l.add(new WeakReference<AlertListener>(listener));
} else {
l.remove(listener);
Iterator<WeakReference<AlertListener>> iterator = l.iterator();
while (iterator.hasNext()) {
WeakReference<AlertListener> ref = iterator.next();
if (ref.get() == listener) {
iterator.remove();
}
}
}

listenerSnapshots.append(type, l.toArray(new AlertListener[0]));
listenerSnapshots.append(type, l.toArray(new WeakReference[0]));
}

private static List<Pair<String, Integer>> defaultRouters() {
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/frostwire/jlibtorrent/alerts/Alerts.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public static Alert cast(alert a) {
return TABLE[a.type()].cast(a);
}

@SuppressWarnings("unchecked")
private static CastLambda[] buildTable() {
CastLambda[] arr = new CastLambda[libtorrent.num_alert_types];

Expand Down

0 comments on commit c8c918c

Please sign in to comment.