From 0a7bc8f430e3e4017910780a898a5f20d337895b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 13 Mar 2019 18:56:37 -0700 Subject: [PATCH] runtime: introduce and consistently use setNsec for timespec The general code for setting a timespec value sometimes used set_nsec and sometimes used a combination of set_sec and set_nsec. Standardize on a setNsec function that takes a number of nanoseconds and splits them up to set the tv_sec and tv_nsec fields. Consistently mark setNsec as go:nosplit, since it has to be that way on some systems including Darwin and GNU/Linux. Consistently use timediv on 32-bit systems to help stay within split-stack limits on processors that don't have a 64-bit division instruction. Change-Id: I6396bb7ddbef171a96876bdeaf7a1c585a6d725b Reviewed-on: https://go-review.googlesource.com/c/go/+/167389 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- src/runtime/defs1_netbsd_386.go | 9 +++------ src/runtime/defs1_netbsd_amd64.go | 10 ++++------ src/runtime/defs1_netbsd_arm.go | 9 +++------ src/runtime/defs1_solaris_amd64.go | 6 ++++++ src/runtime/defs_aix_ppc64.go | 7 +++++++ src/runtime/defs_darwin_386.go | 5 ++--- src/runtime/defs_darwin_amd64.go | 6 +++--- src/runtime/defs_darwin_arm.go | 5 ++--- src/runtime/defs_darwin_arm64.go | 6 +++--- src/runtime/defs_dragonfly_amd64.go | 6 ++++-- src/runtime/defs_freebsd_386.go | 5 +++-- src/runtime/defs_freebsd_amd64.go | 6 ++++-- src/runtime/defs_freebsd_arm.go | 5 +++-- src/runtime/defs_linux_386.go | 9 +++------ src/runtime/defs_linux_amd64.go | 10 ++++------ src/runtime/defs_linux_arm.go | 9 +++------ src/runtime/defs_linux_arm64.go | 10 ++++------ src/runtime/defs_linux_mips64x.go | 10 ++++------ src/runtime/defs_linux_mipsx.go | 9 ++------- src/runtime/defs_linux_ppc64.go | 10 ++++------ src/runtime/defs_linux_ppc64le.go | 10 ++++------ src/runtime/defs_linux_s390x.go | 10 ++++------ src/runtime/defs_nacl_386.go | 5 +++++ src/runtime/defs_nacl_amd64p32.go | 6 ++++++ src/runtime/defs_nacl_arm.go | 5 +++++ src/runtime/defs_openbsd_386.go | 9 +++------ src/runtime/defs_openbsd_amd64.go | 10 ++++------ src/runtime/defs_openbsd_arm.go | 9 +++------ src/runtime/os_darwin.go | 2 +- src/runtime/os_freebsd.go | 2 +- src/runtime/os_linux.go | 17 ++--------------- src/runtime/os_netbsd.go | 4 +--- src/runtime/os_openbsd.go | 5 +---- src/runtime/runtime1.go | 1 + 34 files changed, 112 insertions(+), 135 deletions(-) diff --git a/src/runtime/defs1_netbsd_386.go b/src/runtime/defs1_netbsd_386.go index c26f417a02..3eae12eed0 100644 --- a/src/runtime/defs1_netbsd_386.go +++ b/src/runtime/defs1_netbsd_386.go @@ -106,12 +106,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs1_netbsd_amd64.go b/src/runtime/defs1_netbsd_amd64.go index 0704cd4fb3..51d55c91f9 100644 --- a/src/runtime/defs1_netbsd_amd64.go +++ b/src/runtime/defs1_netbsd_amd64.go @@ -108,12 +108,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs1_netbsd_arm.go b/src/runtime/defs1_netbsd_arm.go index d2a13ad4b0..fadb3415b3 100644 --- a/src/runtime/defs1_netbsd_arm.go +++ b/src/runtime/defs1_netbsd_arm.go @@ -108,12 +108,9 @@ type timespec struct { _ [4]byte // EABI } -func (ts *timespec) set_sec(x int32) { - ts.tv_sec = int64(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs1_solaris_amd64.go b/src/runtime/defs1_solaris_amd64.go index 5ee3c3fc27..64d51a7bd8 100644 --- a/src/runtime/defs1_solaris_amd64.go +++ b/src/runtime/defs1_solaris_amd64.go @@ -161,6 +161,12 @@ type timespec struct { tv_nsec int64 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 +} + type timeval struct { tv_sec int64 tv_usec int64 diff --git a/src/runtime/defs_aix_ppc64.go b/src/runtime/defs_aix_ppc64.go index e7480d06ba..db17b90496 100644 --- a/src/runtime/defs_aix_ppc64.go +++ b/src/runtime/defs_aix_ppc64.go @@ -126,6 +126,13 @@ type timespec struct { tv_sec int64 tv_nsec int64 } + +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 +} + type timeval struct { tv_sec int64 tv_usec int32 diff --git a/src/runtime/defs_darwin_386.go b/src/runtime/defs_darwin_386.go index ae56d154fa..43dc08a078 100644 --- a/src/runtime/defs_darwin_386.go +++ b/src/runtime/defs_darwin_386.go @@ -149,9 +149,8 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = int32(ns / 1000000000) - t.tv_nsec = int32(ns % 1000000000) +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type fpcontrol struct { diff --git a/src/runtime/defs_darwin_amd64.go b/src/runtime/defs_darwin_amd64.go index a339ebd4c6..59b0effa13 100644 --- a/src/runtime/defs_darwin_amd64.go +++ b/src/runtime/defs_darwin_amd64.go @@ -151,9 +151,9 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = ns / 1000000000 - t.tv_nsec = ns % 1000000000 +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type fpcontrol struct { diff --git a/src/runtime/defs_darwin_arm.go b/src/runtime/defs_darwin_arm.go index 148b0a764e..243f52a5df 100644 --- a/src/runtime/defs_darwin_arm.go +++ b/src/runtime/defs_darwin_arm.go @@ -151,9 +151,8 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = int32(ns / 1000000000) - t.tv_nsec = int32(ns % 1000000000) +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type floatstate32 struct { diff --git a/src/runtime/defs_darwin_arm64.go b/src/runtime/defs_darwin_arm64.go index 46e6d9ff8c..7056074f46 100644 --- a/src/runtime/defs_darwin_arm64.go +++ b/src/runtime/defs_darwin_arm64.go @@ -151,9 +151,9 @@ type timespec struct { } //go:nosplit -func (t *timespec) set_nsec(ns int64) { - t.tv_sec = ns / 1000000000 - t.tv_nsec = ns % 1000000000 +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type exceptionstate64 struct { diff --git a/src/runtime/defs_dragonfly_amd64.go b/src/runtime/defs_dragonfly_amd64.go index c30da805cc..30f1b33845 100644 --- a/src/runtime/defs_dragonfly_amd64.go +++ b/src/runtime/defs_dragonfly_amd64.go @@ -174,8 +174,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_freebsd_386.go b/src/runtime/defs_freebsd_386.go index afdf54055f..c4d5c897d3 100644 --- a/src/runtime/defs_freebsd_386.go +++ b/src/runtime/defs_freebsd_386.go @@ -191,8 +191,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_freebsd_amd64.go b/src/runtime/defs_freebsd_amd64.go index c88c0c55c7..89d36c270d 100644 --- a/src/runtime/defs_freebsd_amd64.go +++ b/src/runtime/defs_freebsd_amd64.go @@ -201,8 +201,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_freebsd_arm.go b/src/runtime/defs_freebsd_arm.go index 0c21ea6cff..cc8c924c37 100644 --- a/src/runtime/defs_freebsd_arm.go +++ b/src/runtime/defs_freebsd_arm.go @@ -163,8 +163,9 @@ type timespec struct { pad_cgo_0 [4]byte } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs_linux_386.go b/src/runtime/defs_linux_386.go index 0ebac17aef..e2fcbcac71 100644 --- a/src/runtime/defs_linux_386.go +++ b/src/runtime/defs_linux_386.go @@ -137,12 +137,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_linux_amd64.go b/src/runtime/defs_linux_amd64.go index c0a0ef0dd4..ddad7fddd4 100644 --- a/src/runtime/defs_linux_amd64.go +++ b/src/runtime/defs_linux_amd64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_arm.go b/src/runtime/defs_linux_arm.go index 43946bb79c..9d10d664e1 100644 --- a/src/runtime/defs_linux_arm.go +++ b/src/runtime/defs_linux_arm.go @@ -94,12 +94,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type stackt struct { diff --git a/src/runtime/defs_linux_arm64.go b/src/runtime/defs_linux_arm64.go index c2cc281ab4..b325a229a1 100644 --- a/src/runtime/defs_linux_arm64.go +++ b/src/runtime/defs_linux_arm64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_mips64x.go b/src/runtime/defs_linux_mips64x.go index 9dacd5d1e9..a52d0d40cf 100644 --- a/src/runtime/defs_linux_mips64x.go +++ b/src/runtime/defs_linux_mips64x.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_mipsx.go b/src/runtime/defs_linux_mipsx.go index 9532ac54ee..f3a1dd0cf0 100644 --- a/src/runtime/defs_linux_mipsx.go +++ b/src/runtime/defs_linux_mipsx.go @@ -99,13 +99,8 @@ type timespec struct { } //go:nosplit -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = int32(x) -} - -//go:nosplit -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = timediv(ns, 1e9, &ts.tv_nsec) } type timeval struct { diff --git a/src/runtime/defs_linux_ppc64.go b/src/runtime/defs_linux_ppc64.go index 5a4326da07..f438993721 100644 --- a/src/runtime/defs_linux_ppc64.go +++ b/src/runtime/defs_linux_ppc64.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_ppc64le.go b/src/runtime/defs_linux_ppc64le.go index 5a4326da07..f438993721 100644 --- a/src/runtime/defs_linux_ppc64le.go +++ b/src/runtime/defs_linux_ppc64le.go @@ -99,12 +99,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_linux_s390x.go b/src/runtime/defs_linux_s390x.go index a6cc9c48e9..19b99b5bdf 100644 --- a/src/runtime/defs_linux_s390x.go +++ b/src/runtime/defs_linux_s390x.go @@ -95,12 +95,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_nacl_386.go b/src/runtime/defs_nacl_386.go index 5e65e033ab..70dfcf2c51 100644 --- a/src/runtime/defs_nacl_386.go +++ b/src/runtime/defs_nacl_386.go @@ -14,6 +14,11 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) +} + type excregs386 struct { eax uint32 ecx uint32 diff --git a/src/runtime/defs_nacl_amd64p32.go b/src/runtime/defs_nacl_amd64p32.go index 27afc388cc..37067483f4 100644 --- a/src/runtime/defs_nacl_amd64p32.go +++ b/src/runtime/defs_nacl_amd64p32.go @@ -14,6 +14,12 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = int32(ns % 1e9) +} + type excregs386 struct { eax uint32 ecx uint32 diff --git a/src/runtime/defs_nacl_arm.go b/src/runtime/defs_nacl_arm.go index 817a3d3054..89e539ea7b 100644 --- a/src/runtime/defs_nacl_arm.go +++ b/src/runtime/defs_nacl_arm.go @@ -14,6 +14,11 @@ type timespec struct { tv_nsec int32 } +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) +} + type excregsarm struct { r0 uint32 r1 uint32 diff --git a/src/runtime/defs_openbsd_386.go b/src/runtime/defs_openbsd_386.go index 7b956c44f0..0e59a0591a 100644 --- a/src/runtime/defs_openbsd_386.go +++ b/src/runtime/defs_openbsd_386.go @@ -134,12 +134,9 @@ type timespec struct { tv_nsec int32 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/defs_openbsd_amd64.go b/src/runtime/defs_openbsd_amd64.go index 0a93905717..5cefac5858 100644 --- a/src/runtime/defs_openbsd_amd64.go +++ b/src/runtime/defs_openbsd_amd64.go @@ -144,12 +144,10 @@ type timespec struct { tv_nsec int64 } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = int64(x) +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = ns / 1e9 + ts.tv_nsec = ns % 1e9 } type timeval struct { diff --git a/src/runtime/defs_openbsd_arm.go b/src/runtime/defs_openbsd_arm.go index 59f9410e1d..b187e9776f 100644 --- a/src/runtime/defs_openbsd_arm.go +++ b/src/runtime/defs_openbsd_arm.go @@ -139,12 +139,9 @@ type timespec struct { pad_cgo_0 [4]byte } -func (ts *timespec) set_sec(x int64) { - ts.tv_sec = x -} - -func (ts *timespec) set_nsec(x int32) { - ts.tv_nsec = x +//go:nosplit +func (ts *timespec) setNsec(ns int64) { + ts.tv_sec = int64(timediv(ns, 1e9, &ts.tv_nsec)) } type timeval struct { diff --git a/src/runtime/os_darwin.go b/src/runtime/os_darwin.go index 26b02820cd..18c15ad89e 100644 --- a/src/runtime/os_darwin.go +++ b/src/runtime/os_darwin.go @@ -53,7 +53,7 @@ func semasleep(ns int64) int32 { return -1 } var t timespec - t.set_nsec(ns - spent) + t.setNsec(ns - spent) err := pthread_cond_timedwait_relative_np(&mp.cond, &mp.mutex, &t) if err == _ETIMEDOUT { pthread_mutex_unlock(&mp.mutex) diff --git a/src/runtime/os_freebsd.go b/src/runtime/os_freebsd.go index 08f7b0ecf0..ba0afa23bf 100644 --- a/src/runtime/os_freebsd.go +++ b/src/runtime/os_freebsd.go @@ -156,7 +156,7 @@ func futexsleep1(addr *uint32, val uint32, ns int64) { if ns >= 0 { var ut umtx_time ut._clockid = _CLOCK_MONOTONIC - ut._timeout.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ut._timeout.tv_nsec))))) + ut._timeout.setNsec(ns) utp = &ut } ret := sys_umtx_op(addr, _UMTX_OP_WAIT_UINT_PRIVATE, val, unsafe.Sizeof(*utp), utp) diff --git a/src/runtime/os_linux.go b/src/runtime/os_linux.go index a04c995c00..8f3afe0577 100644 --- a/src/runtime/os_linux.go +++ b/src/runtime/os_linux.go @@ -35,8 +35,6 @@ const ( // Don't sleep longer than ns; ns < 0 means forever. //go:nosplit func futexsleep(addr *uint32, val uint32, ns int64) { - var ts timespec - // Some Linux kernels have a bug where futex of // FUTEX_WAIT returns an internal error code // as an errno. Libpthread ignores the return value @@ -47,19 +45,8 @@ func futexsleep(addr *uint32, val uint32, ns int64) { return } - // It's difficult to live within the no-split stack limits here. - // On ARM and 386, a 64-bit divide invokes a general software routine - // that needs more stack than we can afford. So we use timediv instead. - // But on real 64-bit systems, where words are larger but the stack limit - // is not, even timediv is too heavy, and we really need to use just an - // ordinary machine instruction. - if sys.PtrSize == 8 { - ts.set_sec(ns / 1000000000) - ts.set_nsec(int32(ns % 1000000000)) - } else { - ts.tv_nsec = 0 - ts.set_sec(int64(timediv(ns, 1000000000, (*int32)(unsafe.Pointer(&ts.tv_nsec))))) - } + var ts timespec + ts.setNsec(ns) futex(unsafe.Pointer(addr), _FUTEX_WAIT_PRIVATE, val, unsafe.Pointer(&ts), nil, 0) } diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index 7deab3ed03..fa3c9fa649 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -148,9 +148,7 @@ func semasleep(ns int64) int32 { if wait <= 0 { return -1 } - var nsec int32 - ts.set_sec(timediv(wait, 1000000000, &nsec)) - ts.set_nsec(nsec) + ts.setNsec(wait) tsp = &ts } ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil) diff --git a/src/runtime/os_openbsd.go b/src/runtime/os_openbsd.go index 353a5d94ba..42fe315bcd 100644 --- a/src/runtime/os_openbsd.go +++ b/src/runtime/os_openbsd.go @@ -139,10 +139,7 @@ func semasleep(ns int64) int32 { var tsp *timespec if ns >= 0 { var ts timespec - var nsec int32 - ns += nanotime() - ts.set_sec(int64(timediv(ns, 1000000000, &nsec))) - ts.set_nsec(nsec) + ts.setNsec(ns + nanotime()) tsp = &ts } diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go index a597e1cd7f..ad29818e0a 100644 --- a/src/runtime/runtime1.go +++ b/src/runtime/runtime1.go @@ -412,6 +412,7 @@ func setTraceback(level string) { // This is a very special function, do not use it if you are not sure what you are doing. // int64 division is lowered into _divv() call on 386, which does not fit into nosplit functions. // Handles overflow in a time-specific manner. +// This keeps us within no-split stack limits on 32-bit processors. //go:nosplit func timediv(v int64, div int32, rem *int32) int32 { res := int32(0) -- 2.50.0