1
2
3
4
5 package quic
6
7 import "context"
8
9
10 type queue[T any] struct {
11
12 gate gate
13 err error
14 q []T
15 }
16
17 func newQueue[T any]() queue[T] {
18 return queue[T]{gate: newGate()}
19 }
20
21
22
23 func (q *queue[T]) close(err error) {
24 q.gate.lock()
25 defer q.unlock()
26 if q.err == nil {
27 q.err = err
28 }
29 }
30
31
32
33 func (q *queue[T]) put(v T) bool {
34 q.gate.lock()
35 defer q.unlock()
36 if q.err != nil {
37 return false
38 }
39 q.q = append(q.q, v)
40 return true
41 }
42
43
44
45 func (q *queue[T]) get(ctx context.Context) (T, error) {
46 var zero T
47 if err := q.gate.waitAndLock(ctx); err != nil {
48 return zero, err
49 }
50 defer q.unlock()
51 if q.err != nil {
52 return zero, q.err
53 }
54 v := q.q[0]
55 copy(q.q[:], q.q[1:])
56 q.q[len(q.q)-1] = zero
57 q.q = q.q[:len(q.q)-1]
58 return v, nil
59 }
60
61 func (q *queue[T]) unlock() {
62 q.gate.unlock(q.err != nil || len(q.q) > 0)
63 }
64
View as plain text