From 7970b52504fd58dd92c854dc24a43eb9529447e3 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Sat, 10 Jan 2015 00:51:00 +0100 Subject: [PATCH] PeerGroup: Locking fix in newly added method. A bit more logging. --- .../java/org/bitcoinj/core/PeerGroup.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/PeerGroup.java b/core/src/main/java/org/bitcoinj/core/PeerGroup.java index e6dd11628..8ed76a43b 100644 --- a/core/src/main/java/org/bitcoinj/core/PeerGroup.java +++ b/core/src/main/java/org/bitcoinj/core/PeerGroup.java @@ -884,6 +884,7 @@ public class PeerGroup implements TransactionBroadcaster { torClient.stop(); } vRunning = false; + log.info("Stopped."); } catch (Throwable e) { log.error("Exception when shutting down", e); // The executor swallows exceptions :( } @@ -897,6 +898,7 @@ public class PeerGroup implements TransactionBroadcaster { public void stop() { try { stopAsync(); + log.info("Awaiting PeerGroup shutdown ..."); executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); } catch (InterruptedException e) { throw new RuntimeException(e); @@ -1525,21 +1527,26 @@ public class PeerGroup implements TransactionBroadcaster { * @return a future that will be triggered when the number of connected peers implementing protocolVersion or higher >= numPeers */ public ListenableFuture> waitForPeersWithServiceMask(final int numPeers, final int mask) { - List foundPeers = findPeersWithServiceMask(mask); - if (foundPeers.size() >= numPeers) - return Futures.immediateFuture(foundPeers); - final SettableFuture> future = SettableFuture.create(); - addEventListener(new AbstractPeerEventListener() { - @Override - public void onPeerConnected(Peer peer, int peerCount) { - final List peers = findPeersWithServiceMask(mask); - if (peers.size() >= numPeers) { - future.set(peers); - removeEventListener(this); + lock.lock(); + try { + List foundPeers = findPeersWithServiceMask(mask); + if (foundPeers.size() >= numPeers) + return Futures.immediateFuture(foundPeers); + final SettableFuture> future = SettableFuture.create(); + addEventListener(new AbstractPeerEventListener() { + @Override + public void onPeerConnected(Peer peer, int peerCount) { + final List peers = findPeersWithServiceMask(mask); + if (peers.size() >= numPeers) { + future.set(peers); + removeEventListener(this); + } } - } - }); - return future; + }); + return future; + } finally { + lock.unlock(); + } } /**