summaryrefslogtreecommitdiff
path: root/libports/bucket-iterate.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1999-02-28 20:51:27 +0000
committerRoland McGrath <roland@gnu.org>1999-02-28 20:51:27 +0000
commit52f4dc632e532794b8d7ae6c459f6e68d8f44b84 (patch)
tree7195787b030174f0663360044f71e748ca758e93 /libports/bucket-iterate.c
parent52c79c2735971c6f7ebf9f06c933afbdbf4707ca (diff)
1999-02-28 Roland McGrath <roland@baalperazim.frob.com>
* bucket-iterate.c (_ports_bucket_class_iterate): New function, transmorgified from ports_bucket_iterate. (ports_bucket_iterate): Now just call that to do the work. * class-iterate.c: New file. (ports_class_iterate): New function. * ports.h: Declare ports_class_iterate and _ports_bucket_class_iterate. * Makefile (SRCS): Add class-iterate.c.
Diffstat (limited to 'libports/bucket-iterate.c')
-rw-r--r--libports/bucket-iterate.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/libports/bucket-iterate.c b/libports/bucket-iterate.c
index 9b49579f..1bfd73e3 100644
--- a/libports/bucket-iterate.c
+++ b/libports/bucket-iterate.c
@@ -1,5 +1,5 @@
-/*
- Copyright (C) 1995 Free Software Foundation, Inc.
+/* Iterate a function over the ports in a bucket.
+ Copyright (C) 1995, 1999 Free Software Foundation, Inc.
Written by Michael I. Bushnell.
This file is part of the GNU Hurd.
@@ -22,13 +22,17 @@
#include <cthreads.h>
#include <hurd/ihash.h>
-/* This is obsecenely ineffecient. ihash and ports need to cooperate
- more closely to do it effeciently. */
+
+/* Internal entrypoint for both ports_bucket_iterate and ports_class_iterate.
+ If CLASS is non-null, call FUN only for ports in that class. */
error_t
-ports_bucket_iterate (struct port_bucket *bucket,
- error_t (*fun)(void *))
+_ports_bucket_class_iterate (struct port_bucket *bucket,
+ struct port_class *class,
+ error_t (*fun)(void *))
{
- struct item
+ /* This is obsecenely ineffecient. ihash and ports need to cooperate
+ more closely to do it effeciently. */
+ struct item
{
struct item *next;
void *p;
@@ -36,22 +40,26 @@ ports_bucket_iterate (struct port_bucket *bucket,
struct item *i, *nxt;
error_t err;
- error_t enqueue (void *pi)
+ error_t enqueue (void *arg)
{
+ struct port_info *const pi = arg;
struct item *j;
-
- j = malloc (sizeof (struct item));
- j->next = list;
- j->p = pi;
- list = j;
- ((struct port_info *)pi)->refcnt++;
+
+ if (class == 0 || pi->class == class)
+ {
+ j = malloc (sizeof (struct item));
+ j->next = list;
+ j->p = pi;
+ list = j;
+ pi->refcnt++;
+ }
return 0;
}
-
+
mutex_lock (&_ports_lock);
ihash_iterate (bucket->htable, enqueue);
mutex_unlock (&_ports_lock);
-
+
err = 0;
for (i = list; i; i = nxt)
{
@@ -62,4 +70,11 @@ ports_bucket_iterate (struct port_bucket *bucket,
free (i);
}
return err;
-}
+}
+
+error_t
+ports_bucket_iterate (struct port_bucket *bucket,
+ error_t (*fun)(void *))
+{
+ return _ports_bucket_class_iterate (bucket, 0, fun);
+}