summaryrefslogtreecommitdiff
path: root/src/reader.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/reader.go')
-rw-r--r--src/reader.go39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/reader.go b/src/reader.go
index 1572e5de..401b8f0f 100644
--- a/src/reader.go
+++ b/src/reader.go
@@ -4,6 +4,8 @@ import (
"bufio"
"io"
"os"
+ "sync/atomic"
+ "time"
"github.com/junegunn/fzf/src/util"
)
@@ -13,10 +15,43 @@ type Reader struct {
pusher func([]byte) bool
eventBox *util.EventBox
delimNil bool
+ event int32
+}
+
+// NewReader returns new Reader object
+func NewReader(pusher func([]byte) bool, eventBox *util.EventBox, delimNil bool) *Reader {
+ return &Reader{pusher, eventBox, delimNil, int32(EvtReady)}
+}
+
+func (r *Reader) startEventPoller() {
+ go func() {
+ ptr := &r.event
+ pollInterval := readerPollIntervalMin
+ for {
+ if atomic.CompareAndSwapInt32(ptr, int32(EvtReadNew), int32(EvtReady)) {
+ r.eventBox.Set(EvtReadNew, true)
+ pollInterval = readerPollIntervalMin
+ } else if atomic.LoadInt32(ptr) == int32(EvtReadFin) {
+ return
+ } else {
+ pollInterval += readerPollIntervalStep
+ if pollInterval > readerPollIntervalMax {
+ pollInterval = readerPollIntervalMax
+ }
+ }
+ time.Sleep(pollInterval)
+ }
+ }()
+}
+
+func (r *Reader) fin(success bool) {
+ atomic.StoreInt32(&r.event, int32(EvtReadFin))
+ r.eventBox.Set(EvtReadFin, success)
}
// ReadSource reads data from the default command or from standard input
func (r *Reader) ReadSource() {
+ r.startEventPoller()
var success bool
if util.IsTty() {
cmd := os.Getenv("FZF_DEFAULT_COMMAND")
@@ -27,7 +62,7 @@ func (r *Reader) ReadSource() {
} else {
success = r.readFromStdin()
}
- r.eventBox.Set(EvtReadFin, success)
+ r.fin(success)
}
func (r *Reader) feed(src io.Reader) {
@@ -51,7 +86,7 @@ func (r *Reader) feed(src io.Reader) {
}
}
if r.pusher(bytea) {
- r.eventBox.Set(EvtReadNew, true)
+ atomic.StoreInt32(&r.event, int32(EvtReadNew))
}
}
if err != nil {