summaryrefslogtreecommitdiff
path: root/sysdeps/mach/hurd/i386
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 21:01:04 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 21:01:04 +0200
commit2f9a655079b89bca89c976a144d762a88d39098f (patch)
tree9c098a929e9d8180f495e1e106fbb89bab74328d /sysdeps/mach/hurd/i386
parent688dd91756d4c8e7005eb25b0bf96ede8c32d639 (diff)
parent0ade236f193778d89a77d8f8b4a99cabdf8fad93 (diff)
Merge branch 't/tls_thread_leak' into refs/top-bases/tschwinge/Roger_Whittaker
Diffstat (limited to 'sysdeps/mach/hurd/i386')
-rw-r--r--sysdeps/mach/hurd/i386/tls.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
index f04e5cd378..32bc1a70a9 100644
--- a/sysdeps/mach/hurd/i386/tls.h
+++ b/sysdeps/mach/hurd/i386/tls.h
@@ -117,9 +117,6 @@ _hurd_tls_init (tcbhead_t *tcb)
from the TLS point of view. */
tcb->tcb = tcb;
- /* Cache our thread port. */
- tcb->self = __mach_thread_self ();
-
/* Get the first available selector. */
int sel = -1;
kern_error_t err = __i386_set_gdt (tcb->self, &sel, desc);
@@ -127,20 +124,26 @@ _hurd_tls_init (tcbhead_t *tcb)
{
/* Old kernel, use a per-thread LDT. */
sel = 0x27;
- err = __i386_set_ldt (tcb->self, sel, &desc, 1);
+ err = __i386_set_ldt (self, sel, &desc, 1);
assert_perror (err);
if (err)
- return "i386_set_ldt failed";
+ {
+ msg = "i386_set_ldt failed";
+ goto out;
+ }
}
else if (err)
{
assert_perror (err); /* Separate from above with different line #. */
- return "i386_set_gdt failed";
+ msg = "i386_set_gdt failed";
+ goto out;
}
/* Now install the new selector. */
asm volatile ("mov %w0, %%gs" :: "q" (sel));
+out:
+ __mach_port_deallocate (__mach_task_self (), self);
return 0;
}