refactor: more flexible Routes API

This commit is contained in:
Matthias Radestock committed 2015-11-08 11:15:31 +00:00
1 parent 39b0357517
commit 59e11e4e8a
2 files changed
+16 -5

No files matched your search

+4 -1
View File
@@ -94,10 +94,13 @@ func NewRouter(config Config, name PeerName, nickName string) *Router {
})
router.Peers.OnInvalidateShortIDs(router.Overlay.InvalidateShortIDs)
router.Routes = NewRoutes(router.Ourself, router.Peers, router.Overlay.InvalidateRoutes)
router.Routes = NewRoutes(router.Ourself, router.Peers)
router.Routes.OnChange(router.Overlay.InvalidateRoutes)
router.ConnectionMaker = NewConnectionMaker(router.Ourself, router.Peers, router.Port, router.PeerDiscovery)
router.TopologyGossip = router.NewGossip("topology", router)
router.acceptLimiter = NewTokenBucket(acceptMaxTokens, acceptTokenDelay)
return router
}
+12 -4
View File
@@ -12,7 +12,7 @@ type Routes struct {
sync.RWMutex
ourself *LocalPeer
peers *Peers
onChange func()
onChange []func()
unicast unicastRoutes
unicastAll unicastRoutes // [1]
broadcast broadcastRoutes
@@ -23,13 +23,12 @@ type Routes struct {
// symmetric ones
}
func NewRoutes(ourself *LocalPeer, peers *Peers, onChange func()) *Routes {
func NewRoutes(ourself *LocalPeer, peers *Peers) *Routes {
recalculate := make(chan *struct{}, 1)
wait := make(chan chan struct{})
routes := &Routes{
ourself: ourself,
peers: peers,
onChange: onChange,
unicast: make(unicastRoutes),
unicastAll: make(unicastRoutes),
broadcast: make(broadcastRoutes),
@@ -44,6 +43,12 @@ func NewRoutes(ourself *LocalPeer, peers *Peers, onChange func()) *Routes {
return routes
}
func (routes *Routes) OnChange(callback func()) {
routes.Lock()
defer routes.Unlock()
routes.onChange = append(routes.onChange, callback)
}
func (routes *Routes) PeerNames() PeerNameSet {
return routes.peers.Names()
}
@@ -159,10 +164,13 @@ func (routes *Routes) calculate() {
routes.unicastAll = unicastAll
routes.broadcast = broadcast
routes.broadcastAll = broadcastAll
onChange := routes.onChange
routes.Unlock()
if !unicast.equals(oldUnicast) || !broadcast.equals(oldBroadcast) {
routes.onChange()
for _, callback := range onChange {
callback()
}
}
}