mirror of
https://github.com/golang/go
synced 2024-11-23 00:40:08 -07:00
runtime/cgo: retry _beginthread on EACCES
We occassionally see _beginthread failing with EACCES, meaning "insufficient resources" according to the Microsoft documentation. Exactly which resources is unclear. Similar to pthread_create on unix systems, we can wait a bit and retry to try to get success. The alternative is to abort, so we may as well give it a try. Fixes #52572. Change-Id: I6e05add53b4ae36c61e53b1ee3fed6bc74e17dfa Reviewed-on: https://go-review.googlesource.com/c/go/+/410355 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
91019cc13d
commit
c7ccabf3fe
@ -129,11 +129,23 @@ void (*(_cgo_get_context_function(void)))(struct context_arg*) {
|
||||
}
|
||||
|
||||
void _cgo_beginthread(void (*func)(void*), void* arg) {
|
||||
int tries;
|
||||
uintptr_t thandle;
|
||||
|
||||
thandle = _beginthread(func, 0, arg);
|
||||
if (thandle == -1) {
|
||||
fprintf(stderr, "runtime: failed to create new OS thread (%d)\n", errno);
|
||||
abort();
|
||||
for (tries = 0; tries < 20; tries++) {
|
||||
thandle = _beginthread(func, 0, arg);
|
||||
if (thandle == -1 && errno == EACCES) {
|
||||
// "Insufficient resources", try again in a bit.
|
||||
//
|
||||
// Note that the first Sleep(0) is a yield.
|
||||
Sleep(tries); // milliseconds
|
||||
continue;
|
||||
} else if (thandle == -1) {
|
||||
break;
|
||||
}
|
||||
return; // Success!
|
||||
}
|
||||
|
||||
fprintf(stderr, "runtime: failed to create new OS thread (%d)\n", errno);
|
||||
abort();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user