diff options
Diffstat (limited to 'debian/patches/0025-maybe_fu-use-pp.patch')
-rw-r--r-- | debian/patches/0025-maybe_fu-use-pp.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/debian/patches/0025-maybe_fu-use-pp.patch b/debian/patches/0025-maybe_fu-use-pp.patch new file mode 100644 index 00000000..58ce3a09 --- /dev/null +++ b/debian/patches/0025-maybe_fu-use-pp.patch @@ -0,0 +1,125 @@ +From a266ace960cb823532140e2c683316a9b803a7a4 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Sun, 12 Oct 2014 15:32:54 +0200 +Subject: [PATCH hurd 25/29] maybe_fu use pp + +--- + libports/complete-deallocate.c | 9 +++------ + libports/destroy-right.c | 32 ++++++++++++-------------------- + 2 files changed, 15 insertions(+), 26 deletions(-) + +diff --git a/libports/complete-deallocate.c b/libports/complete-deallocate.c +index 1a6eb54..6799dfd 100644 +--- a/libports/complete-deallocate.c ++++ b/libports/complete-deallocate.c +@@ -27,7 +27,7 @@ _ports_complete_deallocate (struct port_info *pi) + { + assert ((pi->flags & PORT_HAS_SENDRIGHTS) == 0); + +- if (pi->port_right) ++ if (MACH_PORT_VALID (pi->port_right)) + { + struct references result; + +@@ -45,11 +45,8 @@ _ports_complete_deallocate (struct port_info *pi) + hurd_ihash_locp_remove (&pi->bucket->htable, pi->hentry); + pthread_rwlock_unlock (&_ports_htable_lock); + +- /* If the right has been destroyed using ports_destroy_right, +- port_right is set to MACH_PORT_DEAD. */ +- if (MACH_PORT_VALID (pi->port_right)) +- mach_port_mod_refs (mach_task_self (), pi->port_right, +- MACH_PORT_RIGHT_RECEIVE, -1); ++ mach_port_mod_refs (mach_task_self (), pi->port_right, ++ MACH_PORT_RIGHT_RECEIVE, -1); + pi->port_right = MACH_PORT_NULL; + } + +diff --git a/libports/destroy-right.c b/libports/destroy-right.c +index 1e32379..ed6b66b 100644 +--- a/libports/destroy-right.c ++++ b/libports/destroy-right.c +@@ -36,22 +36,21 @@ ports_destroy_right (void *portstruct) + struct port_info *pi = portstruct; + error_t err; + ++ mach_port_clear_protected_payload (mach_task_self (), ++ pi->port_right); ++ + pthread_mutex_lock (&_ports_lock); + if (pi->port_right != MACH_PORT_NULL) + { +- mach_port_clear_protected_payload (mach_task_self (), +- pi->port_right); +- + pthread_rwlock_wrlock (&_ports_htable_lock); + hurd_ihash_locp_remove (&_ports_htable, pi->ports_htable_entry); + hurd_ihash_locp_remove (&pi->bucket->htable, pi->hentry); + pthread_rwlock_unlock (&_ports_htable_lock); ++ + err = mach_port_mod_refs (mach_task_self (), pi->port_right, + MACH_PORT_RIGHT_RECEIVE, -1); + assert_perror (err); + +- pi->port_right = MACH_PORT_NULL; +- + if (pi->flags & PORT_HAS_SENDRIGHTS) + { + /* There are outstanding send rights, so we might get a +@@ -67,8 +66,6 @@ ports_destroy_right (void *portstruct) + reference here, but defer that instead. */ + defer_dereferencing (pi); + } +- else +- hurd_ihash_locp_remove (&pi->bucket->htable, pi->hentry); + + pi->port_right = MACH_PORT_DEAD; + } +@@ -117,20 +114,17 @@ gc_loop (void *arg) + while (d != NULL) + { + struct deferred_dereference *next = d->next; +- int references; ++ struct references refs; + +- pthread_mutex_lock (&_ports_lock); +- references = d->pi->refcnt; +- pthread_mutex_unlock (&_ports_lock); ++ refcounts_references (&d->pi->refcounts, &refs); + +- assert (references <= 2 || !"reference to destroyed right leaked"); ++ // XXX: Need to think more about this. ++ assert (refs.hard <= 2 || !"reference to destroyed right leaked"); + +- if (references == 2) ++ if (refs.hard == 2) + { ++ /* XXX: does this actually happen? if so, why?? */ + /* Get rid of the hash table reference. */ +- pthread_mutex_lock (&_ports_lock); +- hurd_ihash_locp_remove (&d->pi->bucket->htable, d->pi->hentry); +- pthread_mutex_unlock (&_ports_lock); + ports_port_deref (d->pi); + } + +@@ -177,15 +171,13 @@ defer_dereferencing (struct port_info *pi) + + pthread_once (&once, start_gc); + +- /* XXX we hold _ports_lock, so we cannot do +- ports_port_ref (pi); */ +- pi->refcnt += 1; ++ ports_port_ref (pi); + d->pi = pi; + ++ retry: + /* Append to the current generation. */ + g = __atomic_load_n (&generation, __ATOMIC_RELAXED); + +- retry: + d->next = __atomic_load_n (&generations[g], __ATOMIC_RELAXED); + if (! __atomic_compare_exchange_n (&generations[g], &d->next, d, + 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED)) +-- +2.1.3 + |