diff --git a/src/java/com/threerings/getdown/launcher/TorrentDownloader.java b/src/java/com/threerings/getdown/launcher/TorrentDownloader.java index 0b7920f..8893401 100644 --- a/src/java/com/threerings/getdown/launcher/TorrentDownloader.java +++ b/src/java/com/threerings/getdown/launcher/TorrentDownloader.java @@ -22,8 +22,11 @@ public class TorrentDownloader extends Downloader for (Resource resource : resources) { String url = resource.getRemote().toString() + ".torrent"; Snark snark = new Snark(url, null, -1, null, null); - snark.command_interpreter = false; + SnarkShutdown snarkStopper = new SnarkShutdown(snark.storage, + snark.coordinator, snark.acceptor, snark.trackerclient, null); + Runtime.getRuntime().addShutdownHook(snarkStopper); _torrentmap.put(resource, snark); + _stoppermap.put(resource, snarkStopper); } } @@ -36,11 +39,9 @@ public class TorrentDownloader extends Downloader try { snark.setupNetwork(); length = snark.meta.getTotalLength(); - } catch (Exception e) { - // Unfortunately, the snark library does System.exit(-1) right now - // instead of properly passing the exception up the chain. + } catch (IOException ioe) { Log.warning("Bittorrent failed, falling back to HTTP"); - snark.shutdown(); + _stoppermap.get(rsrc).run(); _fallback = new HTTPDownloader(_resources, _obs); length = _fallback.checkSize(rsrc); } @@ -56,10 +57,8 @@ public class TorrentDownloader extends Downloader return; } Snark snark = _torrentmap.get(rsrc); + SnarkShutdown snarkStopper = _stoppermap.get(rsrc); snark.collectPieces(); - SnarkShutdown snarkhook = new SnarkShutdown(snark.storage, - snark.coordinator, snark.acceptor, snark.trackerclient, snark); - Runtime.getRuntime().addShutdownHook(snarkhook); while (_currentSize != snark.meta.getTotalLength()) { long now = System.currentTimeMillis(); if ((now - _lastUpdate) >= UPDATE_DELAY) { @@ -67,7 +66,7 @@ public class TorrentDownloader extends Downloader if (_currentSize < SIZE_THRESHOLD && (now - _start) >= TIME_THRESHOLD) { // The download isn't going as planned, abort; - snark.shutdown(); + snarkStopper.run(); _fallback = new HTTPDownloader(_resources, _obs); _fallback.doDownload(rsrc); return; @@ -75,13 +74,17 @@ public class TorrentDownloader extends Downloader } updateObserver(); } - snark.shutdown(); + snarkStopper.run(); } /** Keeps a mapping of resource names to torrent downloaders */ protected HashMap _torrentmap = new HashMap(); + /** Keeps a mapping of resource names to torrent stoppers */ + protected HashMap _stoppermap = + new HashMap(); + /** If we fail, revert to using this HTTP download transport */ protected HTTPDownloader _fallback = null;