Mercurial > hg > CbC > CbC_gcc
diff gcc/config/vxlib-tls.c @ 55:77e2b8dfacca gcc-4.4.5
update it from 4.4.3 to 4.5.0
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 12 Feb 2010 23:39:51 +0900 |
parents | a06113de4d67 |
children |
line wrap: on
line diff
--- a/gcc/config/vxlib-tls.c Sun Feb 07 18:28:00 2010 +0900 +++ b/gcc/config/vxlib-tls.c Fri Feb 12 23:39:51 2010 +0900 @@ -91,9 +91,9 @@ include a pointer to a local variable in the TLS data object. */ static int self_owner; -/* The number of threads for this module which have active TLS data. - This is protected by tls_lock. */ -static int active_tls_threads; +/* Flag to check whether the delete hook is installed. Once installed + it is only removed when unloading this module. */ +static volatile int delete_hook_installed; /* kernel provided routines */ extern void *__gthread_get_tls_data (void); @@ -166,7 +166,11 @@ if (data && data->owner == &self_owner) { +#ifdef __RTP__ __gthread_enter_tls_dtor_context (); +#else + __gthread_enter_tsd_dtor_context (tcb); +#endif for (key = 0; key < MAX_KEYS; key++) { if (data->generation[key] == tls_keys.generation[key]) @@ -178,22 +182,17 @@ } } free (data); +#ifdef __RTP__ + __gthread_leave_tls_dtor_context (); +#else + __gthread_leave_tsd_dtor_context (); +#endif - /* We can't handle an error here, so just leave the thread - marked as loaded if one occurs. */ - if (__gthread_mutex_lock (&tls_lock) != ERROR) - { - active_tls_threads--; - if (active_tls_threads == 0) - taskDeleteHookDelete ((FUNCPTR)tls_delete_hook); - __gthread_mutex_unlock (&tls_lock); - } #ifdef __RTP__ __gthread_set_tls_data (0); #else __gthread_set_tsd_data (tcb, 0); #endif - __gthread_leave_tls_dtor_context (); } } @@ -211,13 +210,10 @@ #ifdef __RTP__ /* All threads but this one should have exited by now. */ tls_delete_hook (NULL); -#else - /* Unregister the hook forcibly. The counter of active threads may - be incorrect, because constructors (like the C++ library's) and - destructors (like this one) run in the context of the shell rather - than in a task spawned from this module. */ - taskDeleteHookDelete ((FUNCPTR)tls_delete_hook); #endif + /* Unregister the hook. */ + if (delete_hook_installed) + taskDeleteHookDelete ((FUNCPTR)tls_delete_hook); if (tls_init_guard.done && __gthread_mutex_lock (&tls_lock) != ERROR) semDelete (tls_lock); @@ -331,12 +327,18 @@ data = __gthread_get_tls_data (); if (!data) { - if (__gthread_mutex_lock (&tls_lock) == ERROR) - return ENOMEM; - if (active_tls_threads == 0) - taskDeleteHookAdd ((FUNCPTR)tls_delete_hook); - active_tls_threads++; - __gthread_mutex_unlock (&tls_lock); + if (!delete_hook_installed) + { + /* Install the delete hook. */ + if (__gthread_mutex_lock (&tls_lock) == ERROR) + return ENOMEM; + if (!delete_hook_installed) + { + taskDeleteHookAdd ((FUNCPTR)tls_delete_hook); + delete_hook_installed = 1; + } + __gthread_mutex_unlock (&tls_lock); + } data = malloc (sizeof (struct tls_data)); if (!data)