Skip to content

Commit

Permalink
use read syscall directly to get character
Browse files Browse the repository at this point in the history
Due to go std lib uses poller for os.File introducing in this commit:
golang/go@c05b06a
There are two changes to watch out:
1. os.File.Fd will always return a blocking fd except on bsd.
2. os.File.Read won't return EAGAIN error for nonblocking fd.

So
For 1, we just get tty's fd in advance and then set its block mode.
For 2, we use read syscall directly to get what we wanted error(EAGAIN).

Fix issue #910.

Signed-off-by: Tw <tw19881113@gmail.com>
  • Loading branch information
tw4452852 committed May 24, 2017
1 parent 3a50867 commit 942f07d
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/tui/light.go
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,9 @@ func (r *LightRenderer) updateTerminalSize() {

func (r *LightRenderer) getch(nonblock bool) (int, bool) {
b := make([]byte, 1)
fd := r.fd()
util.SetNonblock(r.ttyin, nonblock)
_, err := r.ttyin.Read(b)
_, err := util.Read(fd, b)
if err != nil {
return 0, false
}
Expand Down
5 changes: 5 additions & 0 deletions src/util/util_unix.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,8 @@ func IsWindows() bool {
func SetNonblock(file *os.File, nonblock bool) {
syscall.SetNonblock(int(file.Fd()), nonblock)
}

// Read executes syscall.Read on file descriptor
func Read(fd int, b []byte) (int, error) {
return syscall.Read(int(fd), b)
}
5 changes: 5 additions & 0 deletions src/util/util_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,8 @@ func IsWindows() bool {
func SetNonblock(file *os.File, nonblock bool) {
syscall.SetNonblock(syscall.Handle(file.Fd()), nonblock)
}

// Read executes syscall.Read on file descriptor
func Read(fd int, b []byte) (int, error) {
return syscall.Read(syscall.Handle(fd), b)
}

0 comments on commit 942f07d

Please sign in to comment.