From 89b2029895df0a3f3587eeba0a519091c3f7a1b5 Mon Sep 17 00:00:00 2001 From: Ryan Prichard Date: Mon, 4 Jun 2018 14:35:57 -0700 Subject: Add __emutls_unregister_key function Replace the existing __attribute__((destructor)) function, unregister_emutls_key, with a function that something else must call explicitly. We don't want the pthread key deleted at program exit, because it's unnecessary and because it may delete the key before other tls-using cleanup code runs. Exposing __emutls_unregister_key allows limiting the cleanup to dlclose (e.g. by calling it only from crtbegin_so.c). Reset emutls_key_created so multiple calls to __emutls_unregister_key are safe. Bug: b/80453944 Test: manual Change-Id: I82d13614ae8042d0501fd2ca64f0ef6189669905 --- gcc-4.9/libgcc/emutls.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'gcc-4.9/libgcc') diff --git a/gcc-4.9/libgcc/emutls.c b/gcc-4.9/libgcc/emutls.c index 525db2839..93c3c0788 100644 --- a/gcc-4.9/libgcc/emutls.c +++ b/gcc-4.9/libgcc/emutls.c @@ -121,12 +121,15 @@ emutls_init (void) emutls_key_created = 1; } -__attribute__((destructor)) -static void -unregister_emutls_key (void) +__attribute__((visibility("hidden"))) +void +__emutls_unregister_key (void) { if (emutls_key_created) - __gthread_key_delete (emutls_key); + { + emutls_key_created = 0; + __gthread_key_delete (emutls_key); + } } #endif -- cgit v1.2.3