]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/cgo: retry when CreateThread fails with ERROR_ACCESS_DENIED
authorqmuntal <quimmuntal@gmail.com>
Tue, 23 Sep 2025 08:46:46 +0000 (10:46 +0200)
committerQuim Muntal <quimmuntal@gmail.com>
Tue, 23 Sep 2025 16:53:14 +0000 (09:53 -0700)
_cgo_beginthread used to retry _beginthread only when it failed with
EACCESS, but CL 651995 switched to CreateThread and incorrectly mapped
EACCESS to ERROR_NOT_ENOUGH_MEMORY. The correct mapping is
ERROR_ACCESS_DENIED.

Fixes #72814
Fixes #75381

Change-Id: I8ba060114aae4e8249576f11a21eff613caa8001
Reviewed-on: https://go-review.googlesource.com/c/go/+/706075
Reviewed-by: Michael Pratt <mpratt@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/cgo/gcc_libinit_windows.c

index 83fc874348197492f7610f8e8769bf9c71269ea0..9275185d6efc9a840db0b6bb211c9553cccf26f1 100644 (file)
@@ -145,7 +145,7 @@ void _cgo_beginthread(unsigned long (__stdcall *func)(void*), void* arg) {
 
        for (tries = 0; tries < 20; tries++) {
                thandle = CreateThread(NULL, 0, func, arg, 0, NULL);
-               if (thandle == 0 && GetLastError() == ERROR_NOT_ENOUGH_MEMORY) {
+               if (thandle == 0 && GetLastError() == ERROR_ACCESS_DENIED) {
                        // "Insufficient resources", try again in a bit.
                        //
                        // Note that the first Sleep(0) is a yield.