summaryrefslogtreecommitdiff
path: root/libports/reallocate-from-external.c
diff options
context:
space:
mode:
Diffstat (limited to 'libports/reallocate-from-external.c')
-rw-r--r--libports/reallocate-from-external.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libports/reallocate-from-external.c b/libports/reallocate-from-external.c
index 8cccb2a7..9944b396 100644
--- a/libports/reallocate-from-external.c
+++ b/libports/reallocate-from-external.c
@@ -43,8 +43,11 @@ ports_reallocate_from_external (void *portstruct, mach_port_t receive)
MACH_PORT_RIGHT_RECEIVE, -1);
assert_perror (err);
+ 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);
+
if ((pi->flags & PORT_HAS_SENDRIGHTS) && !stat.mps_srights)
{
dropref = 1;
@@ -59,11 +62,15 @@ ports_reallocate_from_external (void *portstruct, mach_port_t receive)
pi->port_right = receive;
pi->cancel_threshold = 0;
pi->mscount = stat.mps_mscount;
-
- err = hurd_ihash_add (&pi->bucket->htable, receive, pi);
+
+ pthread_rwlock_wrlock (&_ports_htable_lock);
+ err = hurd_ihash_add (&_ports_htable, receive, pi);
assert_perror (err);
+ err = hurd_ihash_add (&pi->bucket->htable, receive, pi);
+ pthread_rwlock_unlock (&_ports_htable_lock);
pthread_mutex_unlock (&_ports_lock);
-
+ assert_perror (err);
+
mach_port_move_member (mach_task_self (), receive, pi->bucket->portset);
if (stat.mps_srights)