Tweaks
This commit is contained in:
parent
8fd878c75a
commit
f9ab3f4b81
|
@ -5,7 +5,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type fifoQueue struct {
|
type fifoQueue struct {
|
||||||
frames []*inputTask
|
tasks []*inputTask
|
||||||
count int
|
count int
|
||||||
mutex sync.Mutex
|
mutex sync.Mutex
|
||||||
notifs chan struct{}
|
notifs chan struct{}
|
||||||
|
@ -18,16 +18,15 @@ func newFIFOQueue() *fifoQueue {
|
||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *fifoQueue) push(frame *inputTask) bool {
|
func (q *fifoQueue) push(frame *inputTask) {
|
||||||
q.mutex.Lock()
|
q.mutex.Lock()
|
||||||
defer q.mutex.Unlock()
|
defer q.mutex.Unlock()
|
||||||
q.frames = append(q.frames, frame)
|
q.tasks = append(q.tasks, frame)
|
||||||
q.count++
|
q.count++
|
||||||
select {
|
select {
|
||||||
case q.notifs <- struct{}{}:
|
case q.notifs <- struct{}{}:
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *fifoQueue) pop() (*inputTask, bool) {
|
func (q *fifoQueue) pop() (*inputTask, bool) {
|
||||||
|
@ -36,14 +35,14 @@ func (q *fifoQueue) pop() (*inputTask, bool) {
|
||||||
if q.count == 0 {
|
if q.count == 0 {
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
frame := q.frames[0]
|
frame := q.tasks[0]
|
||||||
q.frames[0] = nil
|
q.tasks[0] = nil
|
||||||
q.frames = q.frames[1:]
|
q.tasks = q.tasks[1:]
|
||||||
q.count--
|
q.count--
|
||||||
if q.count == 0 {
|
if q.count == 0 {
|
||||||
// Force a GC of the underlying array, since it might have
|
// Force a GC of the underlying array, since it might have
|
||||||
// grown significantly if the queue was hammered for some reason
|
// grown significantly if the queue was hammered for some reason
|
||||||
q.frames = nil
|
q.tasks = nil
|
||||||
}
|
}
|
||||||
return frame, true
|
return frame, true
|
||||||
}
|
}
|
||||||
|
@ -51,7 +50,7 @@ func (q *fifoQueue) pop() (*inputTask, bool) {
|
||||||
func (q *fifoQueue) wait() <-chan struct{} {
|
func (q *fifoQueue) wait() <-chan struct{} {
|
||||||
q.mutex.Lock()
|
q.mutex.Lock()
|
||||||
defer q.mutex.Unlock()
|
defer q.mutex.Unlock()
|
||||||
if q.count > 0 {
|
if q.count > 0 && len(q.notifs) == 0 {
|
||||||
ch := make(chan struct{})
|
ch := make(chan struct{})
|
||||||
close(ch)
|
close(ch)
|
||||||
return ch
|
return ch
|
||||||
|
|
Loading…
Reference in a new issue