summaryrefslogtreecommitdiff
path: root/libports/transfer-right.c
diff options
context:
space:
mode:
Diffstat (limited to 'libports/transfer-right.c')
-rw-r--r--libports/transfer-right.c18
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);