go/src/internal
Ian Lance Taylor 8c1db77a92 internal/poll, os: loop on EINTR
Historically we've assumed that we can install all signal handlers
with the SA_RESTART flag set, and let the system restart slow functions
if a signal is received. Therefore, we don't have to worry about EINTR.

This is only partially true, and we've added EINTR checks already for
connect, and open/read on Darwin, and sendfile on Solaris.

Other cases have turned up in #36644, #38033, and #38836.

Also, #20400 points out that when Go code is included in a C program,
the C program may install its own signal handlers without SA_RESTART.
In that case, Go code will see EINTR no matter what it does.

So, go ahead and check for EINTR. We don't check in the syscall package;
people using syscalls directly may want to check for EINTR themselves.
But we do check for EINTR in the higher level APIs in os and net,
and retry the system call if we see it.

This change looks safe, but of course we may be missing some cases
where we need to check for EINTR. As such cases turn up, we can add
tests to runtime/testdata/testprogcgo/eintr.go, and fix the code.
If there are any such cases, their handling after this change will be
no worse than it is today.

For #22838
Fixes #20400
Fixes #36644
Fixes #38033
Fixes #38836

Change-Id: I7e46ca8cafed0429c7a2386cc9edc9d9d47a6896
Reviewed-on: https://go-review.googlesource.com/c/go/+/232862
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
2020-05-11 22:38:32 +00:00
..
bytealg strings, bytes: improve IndexAny and LastIndexAny performance 2020-03-11 05:13:13 +00:00
cfg cmd/internal/obj/x86: prevent jumps crossing 32 byte boundaries 2020-05-01 19:55:48 +00:00
cpu internal/cpu: unify HWCap/HWCap2 comments 2020-04-13 10:26:24 +00:00
fmtsort src: gofmt -s 2019-09-09 18:57:05 +00:00
goroot internal/goroot: for -compiler=gccgo, only look for .gox files 2019-09-18 20:32:43 +00:00
goversion internal/goversion: update to 1.15 2020-04-28 15:02:35 +00:00
lazyregexp internal/lazytemplate: add a lazy template wrapper 2019-02-27 23:49:01 +00:00
lazytemplate internal/lazytemplate: add a lazy template wrapper 2019-02-27 23:49:01 +00:00
nettrace
obscuretestdata all: base64-encode binaries that will cause Apple notarization to fail 2019-11-21 14:55:12 +00:00
oserror all: remove os.ErrTimeout 2019-08-02 17:57:18 +00:00
poll internal/poll, os: loop on EINTR 2020-05-11 22:38:32 +00:00
profile net/http/pprof: support the "seconds" param for block, mutex profiles 2020-04-17 19:35:56 +00:00
race
reflectlite internal/unsafeheader: consolidate stringHeader and sliceHeader declarations into an internal package 2020-05-01 02:31:29 +00:00
singleflight internal/singleflight: format someErr 2019-10-25 16:31:41 +00:00
syscall syscall, internal/syscall/windows: remove utf16PtrToString parameter 2020-05-03 07:23:32 +00:00
testenv all: remove scattered remnants of darwin/arm 2020-04-08 18:35:49 +00:00
testlog
trace internal/trace: add license header to writer.go 2020-05-10 10:22:35 +00:00
unsafeheader internal/unsafeheader: fix reference in godoc comment for type String 2020-05-01 16:14:17 +00:00
xcoff internal/xcoff: fix wrong bit masking comparisons 2020-03-09 18:07:53 +00:00