uquic/datagram_queue.go
2020-12-09 15:31:23 +07:00

51 lines
871 B
Go

package quic
import (
"sync"
"github.com/lucas-clemente/quic-go/internal/wire"
)
type datagramQueue struct {
mutex sync.Mutex
queue chan *wire.DatagramFrame
closeErr error
closed chan struct{}
hasData func()
}
func newDatagramQueue(hasData func()) *datagramQueue {
return &datagramQueue{
queue: make(chan *wire.DatagramFrame),
hasData: hasData,
closed: make(chan struct{}),
}
}
// AddAndWait queues a new DATAGRAM frame.
// It blocks until the frame has been dequeued.
func (h *datagramQueue) AddAndWait(f *wire.DatagramFrame) error {
h.hasData()
select {
case h.queue <- f:
return nil
case <-h.closed:
return h.closeErr
}
}
func (h *datagramQueue) Get() *wire.DatagramFrame {
select {
case f := <-h.queue:
return f
default:
return nil
}
}
func (h *datagramQueue) CloseWithError(e error) {
h.closeErr = e
close(h.closed)
}