perf: avoid lots of communication by signaling once at end of method
License: MIT Signed-off-by: Brian Tiger Chow <brian@perfmode.com>
Brian Tiger Chow committed
Dec 16, 2014 at 21:28 UTC
7280aac83ff52af54225cde33188d0b7b9ee9b4b
1 file changed
+12
-13
exchange/bitswap/strategy/ledgermanager.go
+12
-13
@@ -104,6 +104,16 @@ func (lm *LedgerManager) BlockIsWantedByPeer(k u.Key, p peer.Peer) bool {
104
// MessageReceived performs book-keeping. Returns error if passed invalid
105
// arguments.
106
func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) error {
107
+ newWorkExists := false
108
+ defer func() {
109
+ if newWorkExists {
110
+ // Signal task generation to restart (if stopped!)
111
+ select {
112
+ case lm.workSignal <- struct{}{}:
113
+ default:
114
+ }
115
+ }
116
+ }()
117
lm.lock.Lock()
118
defer lm.lock.Unlock()
119
@@ -117,13 +127,8 @@ func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) er
127
lm.tasklist.Cancel(e.Key, p)
128
} else {
129
l.Wants(e.Key, e.Priority)
130
+ newWorkExists = true
131
lm.tasklist.Push(e.Key, e.Priority, p)
121
-
122
- // Signal task generation to restart (if stopped!)
123
- select {
124
- case lm.workSignal <- struct{}{}:
125
- default:
126
- }
132
}
133
}
134
@@ -132,14 +137,8 @@ func (lm *LedgerManager) MessageReceived(p peer.Peer, m bsmsg.BitSwapMessage) er
137
l.ReceivedBytes(len(block.Data))
138
for _, l := range lm.ledgerMap {
139
if l.WantListContains(block.Key()) {
140
+ newWorkExists = true
141
lm.tasklist.Push(block.Key(), 1, l.Partner)
136
-
137
- // Signal task generation to restart (if stopped!)
138
- select {
139
- case lm.workSignal <- struct{}{}:
140
- default:
141
- }
142
-
142
}
143
}
144
}