diff options
author | Roland McGrath <roland@gnu.org> | 1999-02-28 20:51:27 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1999-02-28 20:51:27 +0000 |
commit | 52f4dc632e532794b8d7ae6c459f6e68d8f44b84 (patch) | |
tree | 7195787b030174f0663360044f71e748ca758e93 /libports/bucket-iterate.c | |
parent | 52c79c2735971c6f7ebf9f06c933afbdbf4707ca (diff) | |
download | hurd-52f4dc632e532794b8d7ae6c459f6e68d8f44b84.tar.gz hurd-52f4dc632e532794b8d7ae6c459f6e68d8f44b84.tar.bz2 hurd-52f4dc632e532794b8d7ae6c459f6e68d8f44b84.zip |
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.c | 49 |
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); +} |