提交 98c3afee 作者: Juan Batiz-Benet 提交者: Brian Tiger Chow

clean up channel use

上级 b77a785c
...@@ -9,31 +9,42 @@ import ( ...@@ -9,31 +9,42 @@ import (
// ChanQueue makes any PeerQueue synchronizable through channels. // ChanQueue makes any PeerQueue synchronizable through channels.
type ChanQueue struct { type ChanQueue struct {
Queue PeerQueue Queue PeerQueue
EnqChan chan *peer.Peer EnqChan chan<- *peer.Peer
DeqChan chan *peer.Peer DeqChan <-chan *peer.Peer
} }
// NewChanQueue creates a ChanQueue by wrapping pq. // NewChanQueue creates a ChanQueue by wrapping pq.
func NewChanQueue(ctx context.Context, pq PeerQueue) *ChanQueue { func NewChanQueue(ctx context.Context, pq PeerQueue) *ChanQueue {
cq := &ChanQueue{ cq := &ChanQueue{Queue: pq}
Queue: pq, cq.process(ctx)
EnqChan: make(chan *peer.Peer, 10),
DeqChan: make(chan *peer.Peer, 10),
}
go cq.process(ctx)
return cq return cq
} }
func (cq *ChanQueue) process(ctx context.Context) { func (cq *ChanQueue) process(ctx context.Context) {
// construct the channels here to be able to use them bidirectionally
enqChan := make(chan *peer.Peer, 10)
deqChan := make(chan *peer.Peer, 10)
cq.EnqChan = enqChan
cq.DeqChan = deqChan
go func() {
defer close(deqChan)
var next *peer.Peer var next *peer.Peer
var item *peer.Peer
var more bool
for { for {
if cq.Queue.Len() == 0 { if cq.Queue.Len() == 0 {
select { select {
case next = <-cq.EnqChan: case next, more = <-enqChan:
if !more {
return
}
case <-ctx.Done(): case <-ctx.Done():
close(cq.DeqChan)
return return
} }
...@@ -42,17 +53,22 @@ func (cq *ChanQueue) process(ctx context.Context) { ...@@ -42,17 +53,22 @@ func (cq *ChanQueue) process(ctx context.Context) {
} }
select { select {
case item := <-cq.EnqChan: case item, more = <-enqChan:
if !more {
return
}
cq.Queue.Enqueue(item) cq.Queue.Enqueue(item)
cq.Queue.Enqueue(next) cq.Queue.Enqueue(next)
next = nil next = nil
case cq.DeqChan <- next: case deqChan <- next:
next = nil next = nil
case <-ctx.Done(): case <-ctx.Done():
close(cq.DeqChan)
return return
} }
} }
}()
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论