diff options
-rw-r--r-- | libfshelp/get-identity.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/libfshelp/get-identity.c b/libfshelp/get-identity.c index 17244dee..9f92272e 100644 --- a/libfshelp/get-identity.c +++ b/libfshelp/get-identity.c @@ -42,7 +42,12 @@ id_clean (void *cookie) { struct idspec *i = cookie; pthread_mutex_lock (&idlock); - hurd_ihash_locp_remove (&idhash, i->id_hashloc); + if (refcounts_hard_references(&i->pi.refcounts) == 0) + { + /* Nobody got a send right in between, we can remove from the hash. */ + hurd_ihash_locp_remove (&idhash, i->id_hashloc); + ports_port_deref_weak (&i->pi); + } pthread_mutex_unlock (&idlock); } @@ -50,7 +55,7 @@ static void id_initialize () { assert_backtrace (!idclass); - idclass = ports_create_class (id_clean, NULL); + idclass = ports_create_class (NULL, id_clean); } error_t @@ -75,6 +80,9 @@ fshelp_get_identity (struct port_bucket *bucket, if (err) goto lose_port; + /* Weak reference for the hash entry. */ + ports_port_ref_weak(&i->pi); + *pt = ports_get_right (i); ports_port_deref (i); } |