aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2007-03-20 14:13:30 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2007-03-20 14:13:30 +0000
commitcaaf5345bbdad6db838640bc77ddc7a7aeb87df4 (patch)
tree117bfa4cc79cc13167d4ec4a7b129035d6397070 /gcc
parent2b31200511efd45e241cb8fc6b92149605e71302 (diff)
downloadgcc-caaf5345bbdad6db838640bc77ddc7a7aeb87df4.zip
gcc-caaf5345bbdad6db838640bc77ddc7a7aeb87df4.tar.gz
gcc-caaf5345bbdad6db838640bc77ddc7a7aeb87df4.tar.bz2
* config/vxlib.c (tls_delete_hook): Use TCB for kernel tasks.
From-SVN: r123086
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/vxlib-tls.c16
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 18a85ec..b395834 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2007-03-20 Nathan Sidwell <nathan@codesourcery.com>
+
+ * config/vxlib.c (tls_delete_hook): Use TCB for kernel tasks.
+
2007-03-19 Andrew Haley <aph@redhat.com>
PR tree-optimization/31264
diff --git a/gcc/config/vxlib-tls.c b/gcc/config/vxlib-tls.c
index eba8f5c..e983555 100644
--- a/gcc/config/vxlib-tls.c
+++ b/gcc/config/vxlib-tls.c
@@ -155,9 +155,18 @@ static __gthread_once_t tls_init_guard = __GTHREAD_ONCE_INIT;
static void
tls_delete_hook (void *tcb ATTRIBUTE_UNUSED)
{
- struct tls_data *data = __gthread_get_tls_data ();
+ struct tls_data *data;
__gthread_key_t key;
+#ifdef __RTP__
+ data = __gthread_get_tls_data ();
+#else
+ /* In kernel mode, we can be called in the context of the thread
+ doing the killing, so must use the TCB to determine the data of
+ the thread being killed. */
+ data = __gthread_get_tsd_data (tcb);
+#endif
+
if (data && data->owner == &self_owner)
{
__gthread_enter_tls_dtor_context ();
@@ -182,8 +191,11 @@ tls_delete_hook (void *tcb ATTRIBUTE_UNUSED)
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 ();
}
}