From d467f3bbc9c76805ae16ab1924c28ec3be487875 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sun, 16 Feb 2020 12:01:02 +1100 Subject: [PATCH] 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. Fixes #37149 Change-Id: I2beba9d45cdb8c1efac5e974e747827a6261915a Reviewed-on: https://go-review.googlesource.com/c/go/+/219657 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements Reviewed-by: Jason A. Donenfeld --- src/runtime/os_windows.go | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/runtime/os_windows.go b/src/runtime/os_windows.go index 7576565599ea5..26da169be86c2 100644 --- a/src/runtime/os_windows.go +++ b/src/runtime/os_windows.go @@ -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(¶ms)), 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