mirror of
https://github.com/golang/go
synced 2024-11-24 04:50:07 -07:00
runtime/cgo: raise the thread-local storage slot search limit on Android
On Android, the thread local offset is found by looping through memory starting at the TLS base address. The search is limited to PTHREAD_KEYS_MAX, but issue 19472 made it clear that in some cases, the slot is located further from the TLS base. The limit is merely a sanity check in case our assumptions about the thread-local storage layout are wrong, so this CL raises it to 384, which is enough for the test case in issue 19472. Fixes #19472 Change-Id: I89d1db3e9739d3a7fff5548ae487a7483c0a278a Reviewed-on: https://go-review.googlesource.com/38636 Run-TryBot: Elias Naur <elias.naur@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
aa4c2ca316
commit
0476c7a7b5
@ -10,13 +10,6 @@
|
|||||||
|
|
||||||
#define magic1 (0x23581321U)
|
#define magic1 (0x23581321U)
|
||||||
|
|
||||||
// PTHREAD_KEYS_MAX has been added to sys/limits.h at head in bionic:
|
|
||||||
// https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/limits.h
|
|
||||||
// TODO(crawshaw): remove this definition when NDK r10d is required.
|
|
||||||
#ifndef PTHREAD_KEYS_MAX
|
|
||||||
#define PTHREAD_KEYS_MAX 128
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// inittls allocates a thread-local storage slot for g.
|
// inittls allocates a thread-local storage slot for g.
|
||||||
//
|
//
|
||||||
// It finds the first available slot using pthread_key_create and uses
|
// It finds the first available slot using pthread_key_create and uses
|
||||||
@ -32,7 +25,11 @@ inittls(void **tlsg, void **tlsbase)
|
|||||||
fatalf("pthread_key_create failed: %d", err);
|
fatalf("pthread_key_create failed: %d", err);
|
||||||
}
|
}
|
||||||
pthread_setspecific(k, (void*)magic1);
|
pthread_setspecific(k, (void*)magic1);
|
||||||
for (i=0; i<PTHREAD_KEYS_MAX; i++) {
|
// If thread local slots are laid out as we expect, our magic word will
|
||||||
|
// be located at some low offset from tlsbase. However, just in case something went
|
||||||
|
// wrong, the search is limited to sensible offsets. PTHREAD_KEYS_MAX was the
|
||||||
|
// original limit, but issue 19472 made a higher limit necessary.
|
||||||
|
for (i=0; i<384; i++) {
|
||||||
if (*(tlsbase+i) == (void*)magic1) {
|
if (*(tlsbase+i) == (void*)magic1) {
|
||||||
*tlsg = (void*)(i*sizeof(void *));
|
*tlsg = (void*)(i*sizeof(void *));
|
||||||
pthread_setspecific(k, 0);
|
pthread_setspecific(k, 0);
|
||||||
|
@ -25,7 +25,11 @@ inittls(void **tlsg, void **tlsbase)
|
|||||||
fatalf("pthread_key_create failed: %d", err);
|
fatalf("pthread_key_create failed: %d", err);
|
||||||
}
|
}
|
||||||
pthread_setspecific(k, (void*)magic1);
|
pthread_setspecific(k, (void*)magic1);
|
||||||
for (i=0; i<PTHREAD_KEYS_MAX; i++) {
|
// If thread local slots are laid out as we expect, our magic word will
|
||||||
|
// be located at some low offset from tlsbase. However, just in case something went
|
||||||
|
// wrong, the search is limited to sensible offsets. PTHREAD_KEYS_MAX was the
|
||||||
|
// original limit, but issue 19472 made a higher limit necessary.
|
||||||
|
for (i=0; i<384; i++) {
|
||||||
if (*(tlsbase+i) == (void*)magic1) {
|
if (*(tlsbase+i) == (void*)magic1) {
|
||||||
*tlsg = (void*)(i*sizeof(void *));
|
*tlsg = (void*)(i*sizeof(void *));
|
||||||
pthread_setspecific(k, 0);
|
pthread_setspecific(k, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user