diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java index e8b1233735..ee651ed855 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java @@ -117,9 +117,8 @@ public class PeerAcceptor } } else { // multitorrent capable, so lets see what we can handle - for (Iterator iter = coordinators.iterator(); iter.hasNext(); ) { - PeerCoordinator cur = (PeerCoordinator)iter.next(); - + PeerCoordinator cur = coordinators.get(peerInfoHash); + if (cur != null) { if (DataHelper.eq(cur.getInfoHash(), peerInfoHash)) { if (cur.needPeers()) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinatorSet.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinatorSet.java index de367c4d4b..7b1347bf79 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinatorSet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinatorSet.java @@ -1,9 +1,10 @@ package org.klomp.snark; -import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; -import java.util.Set; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import net.i2p.crypto.SHA1Hash; /** * Hmm, any guesses as to what this is? Used by the multitorrent functionality @@ -12,26 +13,28 @@ import java.util.Set; * from it there too) */ public class PeerCoordinatorSet { - private final Set _coordinators; + private final Map _coordinators; public PeerCoordinatorSet() { - _coordinators = new HashSet(); + _coordinators = new ConcurrentHashMap(); } - - public Iterator iterator() { - synchronized (_coordinators) { - return new ArrayList(_coordinators).iterator(); - } + + public Iterator iterator() { + return _coordinators.values().iterator(); } - + public void add(PeerCoordinator coordinator) { - synchronized (_coordinators) { - _coordinators.add(coordinator); - } + _coordinators.put(new SHA1Hash(coordinator.getInfoHash()), coordinator); } + public void remove(PeerCoordinator coordinator) { - synchronized (_coordinators) { - _coordinators.remove(coordinator); - } + _coordinators.remove(new SHA1Hash(coordinator.getInfoHash())); + } + + /** + * @since 0.9.2 + */ + public PeerCoordinator get(byte[] infoHash) { + return _coordinators.get(new SHA1Hash(infoHash)); } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 138f2dd2c8..9bc0d7cea4 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -252,7 +252,7 @@ public class Snark private boolean stopped; private boolean starting; private byte[] id; - private byte[] infoHash; + private final byte[] infoHash; private String additionalTrackerURL; private final I2PSnarkUtil _util; private final PeerCoordinatorSet _peerCoordinatorSet; @@ -340,6 +340,7 @@ public class Snark meta = null; File f = null; InputStream in = null; + byte[] x_infoHash = null; try { f = new File(torrent); @@ -362,7 +363,7 @@ public class Snark throw new IOException("not found"); } meta = new MetaInfo(in); - infoHash = meta.getInfoHash(); + x_infoHash = meta.getInfoHash(); } catch(IOException ioe) { @@ -403,6 +404,7 @@ public class Snark try { in.close(); } catch (IOException ioe) {} } + infoHash = x_infoHash; // final debug(meta.toString(), INFO); // When the metainfo torrent was created from an existing file/dir @@ -1239,8 +1241,8 @@ public class Snark if (_peerCoordinatorSet == null || uploaders <= 0) return false; int totalUploaders = 0; - for (Iterator iter = _peerCoordinatorSet.iterator(); iter.hasNext(); ) { - PeerCoordinator c = (PeerCoordinator)iter.next(); + for (Iterator iter = _peerCoordinatorSet.iterator(); iter.hasNext(); ) { + PeerCoordinator c = iter.next(); if (!c.halted()) totalUploaders += c.uploaders; } @@ -1253,8 +1255,8 @@ public class Snark if (_peerCoordinatorSet == null) return false; long total = 0; - for (Iterator iter = _peerCoordinatorSet.iterator(); iter.hasNext(); ) { - PeerCoordinator c = (PeerCoordinator)iter.next(); + for (Iterator iter = _peerCoordinatorSet.iterator(); iter.hasNext(); ) { + PeerCoordinator c = iter.next(); if (!c.halted()) total += c.getCurrentUploadRate(); }