From bc677787b700af1ea1f6fef1338ae6f80133a205 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Fri, 20 Nov 2015 12:46:56 +0100 Subject: [PATCH hurd 1/4] libfshelp: acquire references to control ports * libfshelp/translator-list.c (translator_ihash_cleanup): Release reference. (fshelp_set_active_translator): Acquire reference --- libfshelp/translator-list.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c index c87bbaa..87d7f6a 100644 --- a/libfshelp/translator-list.c +++ b/libfshelp/translator-list.c @@ -49,12 +49,13 @@ static pthread_mutex_t translator_ihash_lock = PTHREAD_MUTEX_INITIALIZER; static void translator_ihash_cleanup (void *element, void *arg) { + error_t err; struct translator *translator = element; if (translator->pi) ports_port_deref (translator->pi); - /* No need to deallocate translator->active, we only keep the name of - the port, not a reference. */ + err = mach_port_deallocate (mach_task_self (), translator->active); + assert_perror (err); free (translator->name); free (translator); } @@ -124,8 +125,14 @@ fshelp_set_active_translator (struct port_info *pi, t->pi = pi; } - /* No need to increment the reference count, we only keep the - name, not a reference. */ + if (MACH_PORT_VALID (t->active)) + { + err = mach_port_deallocate (mach_task_self (), t->active); + assert_perror (err); + } + err = mach_port_mod_refs (mach_task_self (), active, + MACH_PORT_RIGHT_SEND, +1); + assert_perror (err); t->active = active; } else @@ -143,6 +150,7 @@ error_t fshelp_remove_active_translator (mach_port_t active) { error_t err = 0; + pthread_mutex_lock (&translator_ihash_lock); struct translator *t = NULL; -- 2.1.4