diff options
Diffstat (limited to 'libports/reallocate-from-external.c')
-rw-r--r-- | libports/reallocate-from-external.c | 15 |
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) |