5
0
mirror of https://github.com/cwinfo/yggdrasil-go.git synced 2024-11-10 07:30:27 +00:00

reduce allocations in switch

This commit is contained in:
Arceliar 2019-05-16 18:10:47 -05:00
parent 522ed147b1
commit 9c01947b1c

View File

@ -577,23 +577,28 @@ func (t *switchTable) start() error {
return nil
}
type closerInfo struct {
port switchPort
dist int
}
// Return a map of ports onto distance, keeping only ports closer to the destination than this node
// If the map is empty (or nil), then no peer is closer
func (t *switchTable) getCloser(dest []byte) map[switchPort]int {
func (t *switchTable) getCloser(dest []byte) []closerInfo {
table := t.getTable()
myDist := table.self.dist(dest)
if myDist == 0 {
// Skip the iteration step if it's impossible to be closer
return nil
}
closer := make(map[switchPort]int, len(table.elems))
t.queues.closer = t.queues.closer[:0]
for _, info := range table.elems {
dist := info.locator.dist(dest)
if dist < myDist {
closer[info.port] = dist
t.queues.closer = append(t.queues.closer, closerInfo{info.port, dist})
}
}
return closer
return t.queues.closer
}
// Returns true if the peer is closer to the destination than ourself
@ -656,9 +661,9 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
var bestDist int
var bestTime time.Time
ports := t.core.peers.getPorts()
for port, dist := range closer {
to := ports[port]
thisTime, isIdle := idle[port]
for _, cinfo := range closer {
to := ports[cinfo.port]
thisTime, isIdle := idle[cinfo.port]
var update bool
switch {
case to == nil:
@ -667,9 +672,9 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
//nothing
case best == nil:
update = true
case dist < bestDist:
case cinfo.dist < bestDist:
update = true
case dist > bestDist:
case cinfo.dist > bestDist:
//nothing
case thisTime.Before(bestTime):
update = true
@ -678,7 +683,7 @@ func (t *switchTable) handleIn(packet []byte, idle map[switchPort]time.Time) boo
}
if update {
best = to
bestDist = dist
bestDist = cinfo.dist
bestTime = thisTime
}
}
@ -711,6 +716,7 @@ type switch_buffers struct {
size uint64 // Total size of all buffers, in bytes
maxbufs int
maxsize uint64
closer []closerInfo // Scratch space
}
func (b *switch_buffers) cleanup(t *switchTable) {