1
0
mirror of https://github.com/golang/go synced 2024-11-14 13:50:23 -07:00

[release-branch.go1.14] runtime: ignore error returned by PowerRegisterSuspendResumeNotification

It appears that PowerRegisterSuspendResumeNotification is not supported
when running inside Docker - see issues #35447, #36557 and #37149.

Our current code relies on error number to determine Docker environment.
But we already saw PowerRegisterSuspendResumeNotification return
ERROR_FILE_NOT_FOUND, ERROR_INVALID_PARAMETERS and ERROR_ACCESS_DENIED
(see issues above). So this approach is not sustainable.

Just ignore PowerRegisterSuspendResumeNotification returned error.

For #37149
Fixes #37699

Change-Id: I2beba9d45cdb8c1efac5e974e747827a6261915a
Reviewed-on: https://go-review.googlesource.com/c/go/+/219657
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Jason A. Donenfeld <Jason@zx2c4.com>
(cherry picked from commit d467f3bbc9)
Reviewed-on: https://go-review.googlesource.com/c/go/+/224586
Run-TryBot: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Alex Brainman 2020-02-16 12:01:02 +11:00 committed by Ian Lance Taylor
parent ca153f4db7
commit 74870669fc

View File

@ -294,9 +294,7 @@ func loadOptionalSyscalls() {
func monitorSuspendResume() {
const (
_DEVICE_NOTIFY_CALLBACK = 2
_ERROR_FILE_NOT_FOUND = 2
_ERROR_INVALID_PARAMETERS = 87
_DEVICE_NOTIFY_CALLBACK = 2
)
type _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS struct {
callback uintptr
@ -323,25 +321,8 @@ func monitorSuspendResume() {
callback: compileCallback(*efaceOf(&fn), true),
}
handle := uintptr(0)
ret := stdcall3(powerRegisterSuspendResumeNotification, _DEVICE_NOTIFY_CALLBACK,
stdcall3(powerRegisterSuspendResumeNotification, _DEVICE_NOTIFY_CALLBACK,
uintptr(unsafe.Pointer(&params)), uintptr(unsafe.Pointer(&handle)))
// This function doesn't use GetLastError(), so we use the return value directly.
switch ret {
case 0:
return // Successful, nothing more to do.
case _ERROR_FILE_NOT_FOUND:
// Systems without access to the suspend/resume notifier
// also have their clock on "program time", and therefore
// don't want or need this anyway.
return
case _ERROR_INVALID_PARAMETERS:
// This is seen when running in Windows Docker.
// See issue 36557.
return
default:
println("runtime: PowerRegisterSuspendResumeNotification failed with errno=", ret)
throw("runtime: PowerRegisterSuspendResumeNotification failure")
}
}
//go:nosplit