Skip to content

Commit

Permalink
runtime/cgo: raise the thread-local storage slot search limit on Android
Browse files Browse the repository at this point in the history
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 golang#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>
  • Loading branch information
Elias Naur authored and lparth committed Apr 13, 2017
1 parent cfe582d commit 60ea5b3
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 9 deletions.
13 changes: 5 additions & 8 deletions src/runtime/cgo/gcc_android_arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,6 @@

#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.
//
// It finds the first available slot using pthread_key_create and uses
Expand All @@ -32,7 +25,11 @@ inittls(void **tlsg, void **tlsbase)
fatalf("pthread_key_create failed: %d", err);
}
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) {
*tlsg = (void*)(i*sizeof(void *));
pthread_setspecific(k, 0);
Expand Down
6 changes: 5 additions & 1 deletion src/runtime/cgo/gcc_android_arm64.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ inittls(void **tlsg, void **tlsbase)
fatalf("pthread_key_create failed: %d", err);
}
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) {
*tlsg = (void*)(i*sizeof(void *));
pthread_setspecific(k, 0);
Expand Down

0 comments on commit 60ea5b3

Please sign in to comment.