70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
// Code generated by go run gen.go; DO NOT EDIT.
|
|
|
|
package async
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
|
|
"fyne.io/fyne/v2"
|
|
)
|
|
|
|
var itemCanvasObjectPool = sync.Pool{
|
|
New: func() interface{} { return &itemCanvasObject{next: nil, v: nil} },
|
|
}
|
|
|
|
// In puts the given value at the tail of the queue.
|
|
func (q *CanvasObjectQueue) In(v fyne.CanvasObject) {
|
|
i := itemCanvasObjectPool.Get().(*itemCanvasObject)
|
|
i.next = nil
|
|
i.v = v
|
|
|
|
var last, lastnext *itemCanvasObject
|
|
for {
|
|
last = loadCanvasObjectItem(&q.tail)
|
|
lastnext = loadCanvasObjectItem(&last.next)
|
|
if loadCanvasObjectItem(&q.tail) == last {
|
|
if lastnext == nil {
|
|
if casCanvasObjectItem(&last.next, lastnext, i) {
|
|
casCanvasObjectItem(&q.tail, last, i)
|
|
atomic.AddUint64(&q.len, 1)
|
|
return
|
|
}
|
|
} else {
|
|
casCanvasObjectItem(&q.tail, last, lastnext)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Out removes and returns the value at the head of the queue.
|
|
// It returns nil if the queue is empty.
|
|
func (q *CanvasObjectQueue) Out() fyne.CanvasObject {
|
|
var first, last, firstnext *itemCanvasObject
|
|
for {
|
|
first = loadCanvasObjectItem(&q.head)
|
|
last = loadCanvasObjectItem(&q.tail)
|
|
firstnext = loadCanvasObjectItem(&first.next)
|
|
if first == loadCanvasObjectItem(&q.head) {
|
|
if first == last {
|
|
if firstnext == nil {
|
|
return nil
|
|
}
|
|
casCanvasObjectItem(&q.tail, last, firstnext)
|
|
} else {
|
|
v := firstnext.v
|
|
if casCanvasObjectItem(&q.head, first, firstnext) {
|
|
atomic.AddUint64(&q.len, ^uint64(0))
|
|
itemCanvasObjectPool.Put(first)
|
|
return v
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Len returns the length of the queue.
|
|
func (q *CanvasObjectQueue) Len() uint64 {
|
|
return atomic.LoadUint64(&q.len)
|
|
}
|