From f0731f5d52454e1097609f8f30df982346010a56 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Tue, 24 Mar 2015 21:43:11 +0000 Subject: [PATCH] convert Routes actor to use closures for methods --- router/gossip_test.go | 2 +- router/routes.go | 48 +++++++++++++++++-------------------------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/router/gossip_test.go b/router/gossip_test.go index d72a517e..b6494be3 100644 --- a/router/gossip_test.go +++ b/router/gossip_test.go @@ -21,7 +21,7 @@ type mockChannelConnection struct { func NewTestRouter(name PeerName) *Router { router := NewRouter(nil, name, "", nil, 10, 1024, nil) router.ConnectionMaker.queryChan = make(chan *ConnectionMakerInteraction, ChannelSize) - router.Routes.queryChan = make(chan *Interaction, ChannelSize) + router.Routes.actionChan = make(chan RoutesAction, ChannelSize) return router } diff --git a/router/routes.go b/router/routes.go index 89c639a6..ca00721f 100644 --- a/router/routes.go +++ b/router/routes.go @@ -3,17 +3,16 @@ package router import ( "bytes" "fmt" - "log" "sync" ) type Routes struct { sync.RWMutex - ourself *Peer - peers *Peers - unicast map[PeerName]PeerName - broadcast map[PeerName][]PeerName - queryChan chan<- *Interaction + ourself *Peer + peers *Peers + unicast map[PeerName]PeerName + broadcast map[PeerName][]PeerName + actionChan chan<- RoutesAction } func NewRoutes(ourself *Peer, peers *Peers) *Routes { @@ -28,9 +27,9 @@ func NewRoutes(ourself *Peer, peers *Peers) *Routes { } func (routes *Routes) Start() { - queryChan := make(chan *Interaction, ChannelSize) - routes.queryChan = queryChan - go routes.queryLoop(queryChan) + actionChan := make(chan RoutesAction, ChannelSize) + routes.actionChan = actionChan + go routes.actorLoop(actionChan) } func (routes *Routes) Unicast(name PeerName) (PeerName, bool) { @@ -67,34 +66,25 @@ func (routes *Routes) String() string { // ACTOR client API -const ( - RRecalculate = iota -) +type RoutesAction func() // Async. func (routes *Routes) Recalculate() { - routes.queryChan <- &Interaction{code: RRecalculate} + routes.actionChan <- func() { + unicast := routes.calculateUnicast() + broadcast := routes.calculateBroadcast() + routes.Lock() + routes.unicast = unicast + routes.broadcast = broadcast + routes.Unlock() + } } // ACTOR server -func (routes *Routes) queryLoop(queryChan <-chan *Interaction) { +func (routes *Routes) actorLoop(actionChan <-chan RoutesAction) { for { - query, ok := <-queryChan - if !ok { - return - } - switch query.code { - case RRecalculate: - unicast := routes.calculateUnicast() - broadcast := routes.calculateBroadcast() - routes.Lock() - routes.unicast = unicast - routes.broadcast = broadcast - routes.Unlock() - default: - log.Fatal("Unexpected routes query:", query) - } + (<-actionChan)() } }