summaryrefslogtreecommitdiff
path: root/libports/lookup-port.c
diff options
context:
space:
mode:
Diffstat (limited to 'libports/lookup-port.c')
-rw-r--r--libports/lookup-port.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/libports/lookup-port.c b/libports/lookup-port.c
index f79f6f0c..858ee112 100644
--- a/libports/lookup-port.c
+++ b/libports/lookup-port.c
@@ -26,27 +26,22 @@ ports_lookup_port (struct port_bucket *bucket,
mach_port_t port,
struct port_class *class)
{
- struct port_info *pi = 0;
-
+ struct port_info *pi;
+
pthread_mutex_lock (&_ports_lock);
+ pthread_rwlock_rdlock (&_ports_htable_lock);
- if (bucket)
- pi = hurd_ihash_find (&bucket->htable, port);
- else
- for (bucket = _ports_all_buckets; bucket; bucket = bucket->next)
- {
- pi = hurd_ihash_find (&bucket->htable, port);
- if (pi)
- break;
- }
-
- if (pi && class && pi->class != class)
+ pi = hurd_ihash_find (&_ports_htable, port);
+ if (pi
+ && ((class && pi->class != class)
+ || (bucket && pi->bucket != bucket)))
pi = 0;
if (pi)
pi->refcnt++;
+ pthread_rwlock_unlock (&_ports_htable_lock);
pthread_mutex_unlock (&_ports_lock);
-
+
return pi;
}