lazy fire ioloop (#77)

This commit is contained in:
chzyer 2016-09-04 20:49:14 +08:00 committed by GitHub
parent bc5c91eb5b
commit edfa7c9dbf
1 changed files with 11 additions and 7 deletions

6
std.go
View File

@ -72,6 +72,7 @@ type CancelableStdin struct {
data []byte data []byte
read int read int
err error err error
ioloopFired bool
} }
func NewCancelableStdin() *CancelableStdin { func NewCancelableStdin() *CancelableStdin {
@ -79,7 +80,6 @@ func NewCancelableStdin() *CancelableStdin {
notify: make(chan struct{}), notify: make(chan struct{}),
stop: make(chan struct{}), stop: make(chan struct{}),
} }
go c.ioloop()
return c return c
} }
@ -99,6 +99,10 @@ loop:
func (c *CancelableStdin) Read(b []byte) (n int, err error) { func (c *CancelableStdin) Read(b []byte) (n int, err error) {
c.mutex.Lock() c.mutex.Lock()
defer c.mutex.Unlock() defer c.mutex.Unlock()
if !c.ioloopFired {
c.ioloopFired = true
go c.ioloop()
}
c.data = b c.data = b
c.notify <- struct{}{} c.notify <- struct{}{}