diff options
Diffstat (limited to 'libports/transfer-right.c')
-rw-r--r-- | libports/transfer-right.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/libports/transfer-right.c b/libports/transfer-right.c index 72488a99..3f482905 100644 --- a/libports/transfer-right.c +++ b/libports/transfer-right.c @@ -41,7 +41,10 @@ ports_transfer_right (void *tostruct, port = frompi->port_right; if (port != MACH_PORT_NULL) { + pthread_rwlock_wrlock (&_ports_htable_lock); + hurd_ihash_locp_remove (&_ports_htable, frompi->ports_htable_entry); hurd_ihash_locp_remove (&frompi->bucket->htable, frompi->hentry); + pthread_rwlock_unlock (&_ports_htable_lock); frompi->port_right = MACH_PORT_NULL; if (frompi->flags & PORT_HAS_SENDRIGHTS) { @@ -54,7 +57,10 @@ ports_transfer_right (void *tostruct, /* Destroy the existing right in TOPI. */ if (topi->port_right != MACH_PORT_NULL) { + pthread_rwlock_wrlock (&_ports_htable_lock); + hurd_ihash_locp_remove (&_ports_htable, topi->ports_htable_entry); hurd_ihash_locp_remove (&topi->bucket->htable, topi->hentry); + pthread_rwlock_unlock (&_ports_htable_lock); err = mach_port_mod_refs (mach_task_self (), topi->port_right, MACH_PORT_RIGHT_RECEIVE, -1); assert_perror (err); @@ -74,10 +80,16 @@ ports_transfer_right (void *tostruct, topi->port_right = port; topi->cancel_threshold = frompi->cancel_threshold; topi->mscount = frompi->mscount; - + + pthread_mutex_unlock (&_ports_lock); + if (port) { + pthread_rwlock_wrlock (&_ports_htable_lock); + err = hurd_ihash_add (&_ports_htable, port, topi); + assert_perror (err); err = hurd_ihash_add (&topi->bucket->htable, port, topi); + pthread_rwlock_unlock (&_ports_htable_lock); assert_perror (err); if (topi->bucket != frompi->bucket) { @@ -86,9 +98,7 @@ ports_transfer_right (void *tostruct, assert_perror (err); } } - - pthread_mutex_unlock (&_ports_lock); - + /* Take care of any lowered reference counts. */ if (dereffrompi) ports_port_deref (frompi); |