PeerGroup connect/disconnect callback

This commit is contained in:
Miron Cuperman (devrandom)
2011-07-25 22:38:46 +00:00
parent 1cf1147c87
commit be531960d6
4 changed files with 104 additions and 0 deletions

View File

@@ -30,4 +30,10 @@ public class AbstractPeerEventListener extends Object implements PeerEventListen
public void onChainDownloadStarted(Peer peer, int blocksLeft) {
}
public void onPeerConnected(Peer peer, int peerCount) {
}
public void onPeerDisconnected(Peer peer, int peerCount) {
}
}

View File

@@ -45,4 +45,20 @@ public interface PeerEventListener {
* @param blocksLeft the number of blocks left to download
*/
public void onChainDownloadStarted(Peer peer, int blocksLeft);
/**
* Called when a peer is connected
*
* @param peer
* @param peerCount the total number of connected peers
*/
public void onPeerConnected(Peer peer, int peerCount);
/**
* Called when a peer is disconnected
*
* @param peer
* @param peerCount the total number of connected peers
*/
public void onPeerDisconnected(Peer peer, int peerCount);
}

View File

@@ -78,6 +78,9 @@ public class PeerGroup {
// Callback for events related to chain download
private PeerEventListener downloadListener;
// Callbacks for events related to peer connection/disconnection
private Set<PeerEventListener> peerEventListeners;
private NetworkParameters params;
private BlockStore blockStore;
private BlockChain chain;
@@ -93,12 +96,27 @@ public class PeerGroup {
inactives = new LinkedBlockingQueue<PeerAddress>();
peers = Collections.synchronizedSet(new HashSet<Peer>());
peerEventListeners = Collections.synchronizedSet(new HashSet<PeerEventListener>());
peerPool = new ThreadPoolExecutor(CORE_THREADS, DEFAULT_CONNECTIONS,
THREAD_KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1),
new PeerGroupThreadFactory());
}
/**
* Callbacks to the listener are performed in the connection thread. The callback
* should not perform time consuming tasks.
*/
public void addEventListener(PeerEventListener listener) {
peerEventListeners.add(listener);
}
public boolean removeEventListener(PeerEventListener listener) {
return peerEventListeners.remove(listener);
}
/**
* Depending on the environment, this should normally be between 1 and 10, default is 4.
*
@@ -305,6 +323,13 @@ public class PeerGroup {
protected synchronized void handleNewPeer(Peer peer) {
if (downloadListener != null && downloadPeer == null)
startBlockChainDownloadFromPeer(peer);
synchronized (peerEventListeners) {
for (PeerEventListener listener : peerEventListeners) {
synchronized (listener) {
listener.onPeerConnected(peer, peers.size());
}
}
}
}
protected synchronized void handlePeerDeath(Peer peer) {
@@ -316,6 +341,14 @@ public class PeerGroup {
}
}
}
synchronized (peerEventListeners) {
for (PeerEventListener listener : peerEventListeners) {
synchronized (listener) {
listener.onPeerDisconnected(peer, peers.size());
}
}
}
}
private synchronized void startBlockChainDownloadFromPeer(Peer peer) {