Skip to content

Commit 92f977c

Browse files
committed
Fix potential issues of ChannelQueue.
1 parent c14b2a0 commit 92f977c

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

queue.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -100,35 +100,30 @@ func (q ChannelQueue[T]) Put(val T) error {
100100
}
101101

102102
// PutWithTimeout Put the T val(blocking), with timeout
103-
func (q ChannelQueue[T]) PutWithTimeout(val T, timeout *time.Duration) error {
104-
if timeout == nil {
105-
return q.Put(val)
106-
}
107-
103+
func (q ChannelQueue[T]) PutWithTimeout(val T, timeout time.Duration) error {
108104
select {
109105
case q <- val:
110106
return nil
111-
case <-time.After(*timeout):
107+
case <-time.After(timeout):
112108
return ErrQueuePutTimeout
113109
}
114110
}
115111

116112
// Take Take the T val(blocking)
117113
func (q ChannelQueue[T]) Take() (T, error) {
118-
val := <-q
114+
val, ok := <-q
115+
if !ok {
116+
return *new(T), ErrQueueIsClosed
117+
}
119118
return val, nil
120119
}
121120

122121
// TakeWithTimeout Take the T val(blocking), with timeout
123-
func (q ChannelQueue[T]) TakeWithTimeout(timeout *time.Duration) (T, error) {
124-
if timeout == nil {
125-
return q.Take()
126-
}
127-
122+
func (q ChannelQueue[T]) TakeWithTimeout(timeout time.Duration) (T, error) {
128123
select {
129124
case val := <-q:
130125
return val, nil
131-
case <-time.After(*timeout):
126+
case <-time.After(timeout):
132127
return *new(T), ErrQueueTakeTimeout
133128
}
134129
}

queue_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,38 +44,38 @@ func TestChannelQueue(t *testing.T) {
4444
result = 0
4545
timeout = 1 * time.Millisecond
4646
go func() {
47-
result, err = channelQueue.TakeWithTimeout(&timeout)
47+
result, err = channelQueue.TakeWithTimeout(timeout)
4848
assert.Equal(t, nil, err)
4949
assert.Equal(t, 1, result)
50-
result, err = channelQueue.TakeWithTimeout(&timeout)
50+
result, err = channelQueue.TakeWithTimeout(timeout)
5151
assert.Equal(t, nil, err)
5252
assert.Equal(t, 2, result)
53-
result, err = channelQueue.TakeWithTimeout(&timeout)
53+
result, err = channelQueue.TakeWithTimeout(timeout)
5454
assert.Equal(t, nil, err)
5555
assert.Equal(t, 3, result)
56-
result, err = channelQueue.TakeWithTimeout(&timeout)
56+
result, err = channelQueue.TakeWithTimeout(timeout)
5757
assert.NotEqual(t, 4, result)
5858
assert.NotEqual(t, nil, err)
5959
assert.Equal(t, 0, result)
6060
assert.Equal(t, ErrQueueTakeTimeout, err)
6161
}()
6262
go func() {
63-
err = channelQueue.PutWithTimeout(1, &timeout)
63+
err = channelQueue.PutWithTimeout(1, timeout)
6464
assert.Equal(t, nil, err)
65-
err = channelQueue.PutWithTimeout(2, &timeout)
65+
err = channelQueue.PutWithTimeout(2, timeout)
6666
assert.Equal(t, nil, err)
67-
err = channelQueue.PutWithTimeout(3, &timeout)
67+
err = channelQueue.PutWithTimeout(3, timeout)
6868
assert.Equal(t, nil, err)
6969

7070
time.Sleep(3 * timeout / 2)
7171

72-
err = channelQueue.PutWithTimeout(4, &timeout)
72+
err = channelQueue.PutWithTimeout(4, timeout)
7373
assert.Equal(t, nil, err)
74-
err = channelQueue.PutWithTimeout(5, &timeout)
74+
err = channelQueue.PutWithTimeout(5, timeout)
7575
assert.Equal(t, nil, err)
76-
err = channelQueue.PutWithTimeout(6, &timeout)
76+
err = channelQueue.PutWithTimeout(6, timeout)
7777
assert.Equal(t, nil, err)
78-
err = channelQueue.PutWithTimeout(7, &timeout)
78+
err = channelQueue.PutWithTimeout(7, timeout)
7979
assert.NotEqual(t, nil, err)
8080
assert.Equal(t, ErrQueuePutTimeout, err)
8181
}()

0 commit comments

Comments
 (0)