diff options
author | Yorhel <git@yorhel.nl> | 2012-01-25 09:22:14 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2012-01-25 09:22:14 +0100 |
commit | ea3875dc60d9ce7615616c14929a8f69e2388a77 (patch) | |
tree | e531003431ba8dfcd30d7f64723b6bac37de3a30 | |
parent | 74fa1f72adbb6dce0ac72fffcddd81241b357026 (diff) |
tcomm: Incorporated sessionRegData struct into server{Recv,Pattern}
This only improves performance marginally, but looks somewhat cleaner
anyway.
-rw-r--r-- | tcomm/server.go | 4 | ||||
-rw-r--r-- | tcomm/session.go | 18 |
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) } } } |