From 9c0db2f7fde54ac535a2e9797b8c0131550809af Mon Sep 17 00:00:00 2001
From: Dave Collins <davec@conformal.com>
Date: Wed, 3 Dec 2014 18:20:19 -0600
Subject: [PATCH] Ensure all tickers are explicitly stopped.

As pointed out in #189, according to the Go documentation, a ticker must
be stopped to release associated resources.  This commit adds a defer call
to stop two tickers there were previously not being stopped as well as
changes two others that were being stopped over to use defer so it's more
consistent.

The other ticker in ScheduleShutdown is replaced and already calls Stop
before replacing it, so it has not been modified.

Closes #189.

ok @jrick
---
 addrmgr/addrmanager.go | 2 +-
 cpuminer.go            | 3 ++-
 peer.go                | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/addrmgr/addrmanager.go b/addrmgr/addrmanager.go
index 33c6ab13..f4e18479 100644
--- a/addrmgr/addrmanager.go
+++ b/addrmgr/addrmanager.go
@@ -338,6 +338,7 @@ func (a *AddrManager) getTriedBucket(netAddr *btcwire.NetAddress) int {
 // as a goroutine.
 func (a *AddrManager) addressHandler() {
 	dumpAddressTicker := time.NewTicker(dumpAddressInterval)
+	defer dumpAddressTicker.Stop()
 out:
 	for {
 		select {
@@ -348,7 +349,6 @@ out:
 			break out
 		}
 	}
-	dumpAddressTicker.Stop()
 	a.savePeers()
 	a.wg.Done()
 	log.Trace("Address handler done")
diff --git a/cpuminer.go b/cpuminer.go
index b8667b38..618e5489 100644
--- a/cpuminer.go
+++ b/cpuminer.go
@@ -72,6 +72,7 @@ func (m *CPUMiner) speedMonitor() {
 	var hashesPerSec float64
 	var totalHashes uint64
 	ticker := time.NewTicker(time.Second * hpsUpdateSecs)
+	defer ticker.Stop()
 
 out:
 	for {
@@ -261,6 +262,7 @@ func (m *CPUMiner) generateBlocks(quit chan struct{}) {
 	// Start a ticker which is used to signal checks for stale work and
 	// updates to the speed monitor.
 	ticker := time.NewTicker(time.Second * hashUpdateSecs)
+	defer ticker.Stop()
 out:
 	for {
 		// Quit when the miner is stopped.
@@ -318,7 +320,6 @@ out:
 		}
 	}
 
-	ticker.Stop()
 	m.workerWg.Done()
 	minrLog.Tracef("Generate blocks worker done")
 }
diff --git a/peer.go b/peer.go
index 394bba49..bdb63ded 100644
--- a/peer.go
+++ b/peer.go
@@ -1557,6 +1557,7 @@ func (p *peer) queueHandler() {
 	pendingMsgs := list.New()
 	invSendQueue := list.New()
 	trickleTicker := time.NewTicker(time.Second * 10)
+	defer trickleTicker.Stop()
 
 	// We keep the waiting flag so that we know if we have a message queued
 	// to the outHandler or not.  We could use the presence of a head of