diff options
| author | Ian Lance Taylor <iant@golang.org> | 2017-09-13 15:53:47 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2017-09-22 18:17:13 +0000 |
| commit | 332719f7cee2abafb3963009d44ad7cc93474707 (patch) | |
| tree | 39371a6dbd9e627f28b1ee585a2b6c629ed3e3a7 /src/runtime/panic.go | |
| parent | 9daee931214a7ad68579f4bb2695bba561067c58 (diff) | |
| download | go-332719f7cee2abafb3963009d44ad7cc93474707.tar.xz | |
runtime: don't call lockOSThread for every cgo call
For a trivial benchmark with a do-nothing cgo call:
name old time/op new time/op delta
Call-4 64.5ns ± 7% 63.0ns ± 6% -2.25% (p=0.027 n=20+16)
Because Windows uses the cgocall mechanism to make system calls,
and passes arguments in a struct held in the m,
we need to do the lockOSThread/unlockOSThread in that code.
Because deferreturn was getting a nosplit stack overflow error,
change it to avoid calling typedmemmove.
Updates #21827.
Change-Id: I9b1d61434c44faeb29805b46b409c812c9acadc2
Reviewed-on: https://go-review.googlesource.com/64070
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'src/runtime/panic.go')
| -rw-r--r-- | src/runtime/panic.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 1f8e37e14f..2cda10565b 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -273,7 +273,17 @@ func freedefer(d *_defer) { unlock(&sched.deferlock) }) } - *d = _defer{} + + // These lines used to be simply `*d = _defer{}` but that + // started causing a nosplit stack overflow via typedmemmove. + d.siz = 0 + d.started = false + d.sp = 0 + d.pc = 0 + d.fn = nil + d._panic = nil + d.link = nil + pp.deferpool[sc] = append(pp.deferpool[sc], d) } |
