convert Routes actor to use closures for methods

This commit is contained in:
Matthias Radestock committed 2015-03-25 05:14:17 +00:00
1 parent c54b3bcacf
commit f0731f5d52
2 files changed
+20 -30

No files matched your search

+1 -1
View File
@@ -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
}
+19 -29
View File
@@ -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)()
}
}