summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2012-01-25 09:22:14 +0100
committerYorhel <git@yorhel.nl>2012-01-25 09:22:14 +0100
commitea3875dc60d9ce7615616c14929a8f69e2388a77 (patch)
treee531003431ba8dfcd30d7f64723b6bac37de3a30
parent74fa1f72adbb6dce0ac72fffcddd81241b357026 (diff)
tcomm: Incorporated sessionRegData struct into server{Recv,Pattern}
This only improves performance marginally, but looks somewhat cleaner anyway.
-rw-r--r--tcomm/server.go4
-rw-r--r--tcomm/session.go18
2 files changed, 9 insertions, 13 deletions
diff --git a/tcomm/server.go b/tcomm/server.go
index d2e9886..6eac100 100644
--- a/tcomm/server.go
+++ b/tcomm/server.go
@@ -38,12 +38,14 @@ type serverSend struct {
type serverRecv struct {
t Tuple
ch chan<- Tuple
+ id SessionReg
data interface{}
}
type serverPattern struct {
recipient chan<- *serverRecv
willReply bool
+ id SessionReg
data interface{}
}
@@ -95,7 +97,7 @@ func serverDeliver(m *Matcher, n *serverSend) {
}(ch, chout)
}
- p.recipient <- &serverRecv{t, ch, p.data}
+ p.recipient <- &serverRecv{t, ch, p.id, p.data}
})
// Buffer the reply channel and make sure to close it when all sessions have
diff --git a/tcomm/session.go b/tcomm/session.go
index ad7e239..bb8e976 100644
--- a/tcomm/session.go
+++ b/tcomm/session.go
@@ -13,7 +13,7 @@ func sessionRecvQueue(r <-chan *serverRecv, s chan<- *serverRecv, p <-chan Sessi
rem := func(n SessionReg) {
for i := buf.Front(); i != nil; {
re := i.Value.(*serverRecv)
- if re.data.(*sessionRegData).id == n {
+ if re.id == n {
// Make sure to close a reply channel if there is one
if re.ch != nil {
close(re.ch)
@@ -61,11 +61,6 @@ func sessionRecvQueue(r <-chan *serverRecv, s chan<- *serverRecv, p <-chan Sessi
type SessionReg uint64
-type sessionRegData struct {
- id SessionReg
- f interface{}
-}
-
type Session struct {
serv *Server
patterns map[SessionReg]*MatcherItem
@@ -98,7 +93,7 @@ func (s *Session) Request(t ...interface{}) <-chan Tuple {
func (s *Session) registerRaw(willReply bool, f interface{}, p Pattern) SessionReg {
ret := make(chan *MatcherItem)
- s.serv.reg <- &serverRegister{&serverPattern{s.recipient, willReply, &sessionRegData{s.lastId, f}}, p, ret}
+ s.serv.reg <- &serverRegister{&serverPattern{s.recipient, willReply, s.lastId, f}, p, ret}
s.patterns[s.lastId] = <-ret
s.lastId++
return s.lastId - 1
@@ -121,21 +116,20 @@ func (s *Session) Unregister(id SessionReg) {
}
func (s *Session) dispatch(msg *serverRecv) {
- d := msg.data.(*sessionRegData)
- switch f := d.f.(type) {
+ switch f := msg.data.(type) {
case func(Tuple, SessionReg):
// Must have been registered with !willReply, so msg.ch == nil.
- f(msg.t, d.id)
+ f(msg.t, msg.id)
case func(Tuple, chan<- Tuple, SessionReg):
if msg.ch != nil {
- f(msg.t, msg.ch, d.id)
+ f(msg.t, msg.ch, msg.id)
} else {
// Interface consistency: If there are no sessions that will reply,
// then create an already-closed channel and pass that to the
// callback.
ch := make(chan Tuple)
close(ch)
- f(msg.t, ch, d.id)
+ f(msg.t, ch, msg.id)
}
}
}