commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd] 04/16: libfshelp: Add weak reference for hash table reference


From: Samuel Thibault
Subject: [hurd] 04/16: libfshelp: Add weak reference for hash table reference
Date: Tue, 09 Jan 2018 01:35:29 +0000

This is an automated email from the git hooks/post-receive script.

sthibault pushed a commit to branch upstream
in repository hurd.

commit b37c7dd4dd0de064b7ae2c9ad5687ebb635677c8
Author: Samuel Thibault <address@hidden>
Date:   Tue Dec 19 01:39:36 2017 +0100

    libfshelp: Add weak reference for hash table reference
    
    Fixes reference w/o send right crash.
    
    * libfshelp/get-identity.c (fshelp_get_identity): Get weak reference for
    the hash table reference.
    (id_initialize): Pass id_clean as dropweak_routine instead of
    clean_routine to ports_create_class.
    (id_clean): Remove from hash table only if there are no hard references
    left, i.e. we didn't reacquired a port right in between.
---
 libfshelp/get-identity.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/libfshelp/get-identity.c b/libfshelp/get-identity.c
index 17244de..9f92272 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);
     }

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-hurd/hurd.git



reply via email to

[Prev in Thread] Current Thread [Next in Thread]