diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index b0b8b1427d..3825178549 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -16,6 +16,7 @@ public class SnarkManager implements Snark.CompleteListener { /** map of (canonical) filename to Snark instance (unsynchronized) */ private Map _snarks; + private Object _addSnarkLock; private String _configFile; private Properties _config; private I2PAppContext _context; @@ -34,6 +35,7 @@ public class SnarkManager implements Snark.CompleteListener { private SnarkManager() { _snarks = new HashMap(); + _addSnarkLock = new Object(); _context = I2PAppContext.getGlobalContext(); _log = _context.logManager().getLog(SnarkManager.class); _messages = new ArrayList(16); @@ -289,7 +291,16 @@ public class SnarkManager implements Snark.CompleteListener { Snark torrent = null; synchronized (_snarks) { torrent = (Snark)_snarks.get(filename); - if (torrent == null) { + } + // don't hold the _snarks lock while verifying the torrent + if (torrent == null) { + synchronized (_addSnarkLock) { + // double-check + synchronized (_snarks) { + if(_snarks.get(filename) != null) + return; + } + FileInputStream fis = null; try { fis = new FileInputStream(sfile); @@ -305,7 +316,9 @@ public class SnarkManager implements Snark.CompleteListener { } else { torrent = new Snark(filename, null, -1, null, null, false, dataDir.getPath()); torrent.completeListener = this; - _snarks.put(filename, torrent); + synchronized (_snarks) { + _snarks.put(filename, torrent); + } } } catch (IOException ioe) { addMessage("Torrent in " + sfile.getName() + " is invalid: " + ioe.getMessage()); @@ -315,9 +328,9 @@ public class SnarkManager implements Snark.CompleteListener { } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} } - } else { - return; } + } else { + return; } // ok, snark created, now lets start it up or configure it further File f = new File(filename); diff --git a/history.txt b/history.txt index d9b86cce8d..106baf2a6e 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,8 @@ -$Id: history.txt,v 1.546 2007-01-28 23:03:37 zzz Exp $ +$Id: history.txt,v 1.547 2007-01-29 23:05:23 zzz Exp $ + +2007-01-30 zzz + * i2psnark: Don't hold _snarks lock while checking a snark, + so web page is responsive at startup 2007-01-29 zzz * i2psnark: Add NickyB tracker diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index a1bbbe47fc..33c6bfe052 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.482 $ $Date: 2007-01-28 23:03:36 $"; + public final static String ID = "$Revision: 1.483 $ $Date: 2007-01-29 23:05:21 $"; public final static String VERSION = "0.6.1.26"; - public final static long BUILD = 16; + public final static long BUILD = 17; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);