summaryrefslogtreecommitdiff
path: root/hurd/hurdsig.c
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2013-12-23 12:03:12 +0100
committerRichard Braun <rbraun@sceen.net>2013-12-23 12:03:12 +0100
commitb01bde4c4d7571d7323b0fbbae6c5b2da5df978c (patch)
tree3808b259f4d3db55fa74452e1db75fdcd43ccaf4 /hurd/hurdsig.c
parentb1786ee5b8fbe09663596c7554f5322d79eee25b (diff)
parent512a1659ed7c20fa94e32ceb9b3bdf715b1253e9 (diff)
Merge branch 't/sigstate_thread_reference' into refs/top-bases/tschwinge/Roger_Whittaker
Conflicts: hurd/hurd/signal.h
Diffstat (limited to 'hurd/hurdsig.c')
-rw-r--r--hurd/hurdsig.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/hurd/hurdsig.c b/hurd/hurdsig.c
index 2d7b003454..661d3b36e3 100644
--- a/hurd/hurdsig.c
+++ b/hurd/hurdsig.c
@@ -108,6 +108,8 @@ _hurd_thread_sigstate (thread_t thread)
}
else
{
+ error_t err;
+
/* Use the global actions as a default for new threads. */
struct hurd_sigstate *s = _hurd_global_sigstate;
if (s)
@@ -121,6 +123,11 @@ _hurd_thread_sigstate (thread_t thread)
ss->next = _hurd_sigstates;
_hurd_sigstates = ss;
+
+ err = __mach_port_mod_refs (__mach_task_self (), thread,
+ MACH_PORT_RIGHT_SEND, 1);
+ if (err)
+ __libc_fatal ("hurd: Can't add reference on Mach thread\n");
}
}
__mutex_unlock (&_hurd_siglock);
@@ -128,8 +135,7 @@ _hurd_thread_sigstate (thread_t thread)
}
/* Destroy a sigstate structure. Called by libpthread just before the
- * corresponding thread is terminated (the kernel thread port must remain valid
- * until this function is called.) */
+ * corresponding thread is terminated. */
void
_hurd_sigstate_delete (thread_t thread)
{
@@ -146,7 +152,12 @@ _hurd_sigstate_delete (thread_t thread)
__mutex_unlock (&_hurd_siglock);
if (ss)
- free (ss);
+ {
+ if (ss->thread != MACH_PORT_NULL)
+ __mach_port_deallocate (__mach_task_self (), ss->thread);
+
+ free (ss);
+ }
}
/* Make SS a global receiver, with pthread signal semantics. */