Skip to content

Commit

Permalink
move to an infinite queue for binding callbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
andydotxyz committed Feb 21, 2021
1 parent 7d2b239 commit 04bd874
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 4 deletions.
42 changes: 38 additions & 4 deletions data/binding/queue.go
@@ -1,23 +1,57 @@
package binding

var itemQueue = make(chan itemData, 1024)
var itemQueueIn, itemQueueOut = makeInfiniteQueue()

type itemData struct {
fn func()
done chan interface{}
}

func queueItem(f func()) {
itemQueue <- itemData{fn: f}
itemQueueIn <- &itemData{fn: f}
}

func init() {
go processItems()
}

func makeInfiniteQueue() (chan<- *itemData, <-chan *itemData) {
in := make(chan *itemData)
out := make(chan *itemData)
go func() {
var queued []*itemData
pending := func() chan *itemData {
if len(queued) == 0 {
return nil
}
return out
}
next := func() *itemData {
if len(queued) == 0 {
return nil
}
return queued[0]
}
for len(queued) > 0 || in != nil {
select {
case val, ok := <-in:
if !ok {
in = nil
} else {
queued = append(queued, val)
}
case pending() <- next():
queued = queued[1:]
}
}
close(out)
}()
return in, out
}

func processItems() {
for {
i := <-itemQueue
i := <-itemQueueOut
if i.fn != nil {
i.fn()
}
Expand All @@ -29,6 +63,6 @@ func processItems() {

func waitForItems() {
done := make(chan interface{})
itemQueue <- itemData{done: done}
itemQueueIn <- &itemData{done: done}
<-done
}
23 changes: 23 additions & 0 deletions data/binding/queue_test.go
@@ -1,6 +1,7 @@
package binding

import (
"sync"
"testing"

"github.com/stretchr/testify/assert"
Expand All @@ -18,3 +19,25 @@ func TestQueueItem(t *testing.T) {
waitForItems()
assert.Equal(t, 2, called)
}

func TestMakeInfiniteQueue(t *testing.T) {
var wg sync.WaitGroup
in, out := makeInfiniteQueue()

wg.Add(1)
c := 0
go func() {
for range out {
c++
}
wg.Done()
}()

for i := 0; i < 2048; i++ {
in <- &itemData{}
}
close(in)

wg.Wait()
assert.Equal(t, 2048, c)
}

0 comments on commit 04bd874

Please sign in to comment.