]> Cypherpunks.ru repositories - gostls13.git/commit
os: use poller for file I/O
authorIan Lance Taylor <iant@golang.org>
Fri, 10 Feb 2017 23:17:38 +0000 (15:17 -0800)
committerIan Lance Taylor <iant@golang.org>
Wed, 15 Feb 2017 19:31:55 +0000 (19:31 +0000)
commitc05b06a12d005f50e4776095a60d6bd9c2c91fac
treeff6becc629ab17efd3d90355e71ce8f6f7ffe488
parent81ec3f6a6ccd65abc85fc1f5d16af0a4b426029b
os: use poller for file I/O

This changes the os package to use the runtime poller for file I/O
where possible. When a system call blocks on a pollable descriptor,
the goroutine will be blocked on the poller but the thread will be
released to run other goroutines. When using a non-pollable
descriptor, the os package will continue to use thread-blocking system
calls as before.

For example, on GNU/Linux, the runtime poller uses epoll. epoll does
not support ordinary disk files, so they will continue to use blocking
I/O as before. The poller will be used for pipes.

Since this means that the poller is used for many more programs, this
modifies the runtime to only block waiting for the poller if there is
some goroutine that is waiting on the poller. Otherwise, there is no
point, as the poller will never make any goroutine ready. This
preserves the runtime's current simple deadlock detection.

This seems to crash FreeBSD systems, so it is disabled on FreeBSD.
This is issue 19093.

Using the poller on Windows requires opening the file with
FILE_FLAG_OVERLAPPED. We should only do that if we can remove that
flag if the program calls the Fd method. This is issue 19098.

Update #6817.
Update #7903.
Update #15021.
Update #18507.
Update #19093.
Update #19098.

Change-Id: Ia5197dcefa7c6fbcca97d19a6f8621b2abcbb1fe
Reviewed-on: https://go-review.googlesource.com/36800
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
29 files changed:
src/internal/poll/fd_poll_nacl.go
src/internal/poll/fd_poll_runtime.go
src/internal/poll/fd_unix.go
src/internal/poll/fd_windows.go
src/os/dir_unix.go
src/os/dir_windows.go
src/os/error_posix.go [new file with mode: 0644]
src/os/exec/exec_test.go
src/os/export_windows_test.go
src/os/file.go
src/os/file_plan9.go
src/os/file_posix.go
src/os/file_unix.go
src/os/file_windows.go
src/os/os_test.go
src/os/os_windows_test.go
src/os/pipe_bsd.go
src/os/pipe_linux.go
src/os/stat_unix.go
src/os/stat_windows.go
src/runtime/netpoll.go
src/runtime/netpoll_epoll.go
src/runtime/netpoll_kqueue.go
src/runtime/netpoll_nacl.go
src/runtime/netpoll_solaris.go
src/runtime/netpoll_stub.go
src/runtime/netpoll_windows.go
src/runtime/proc.go
src/runtime/trace/trace_stack_test.go