kernel: Add linker_file_foreach() (taken from FreeBSD).
authorSascha Wildner <saw@online.de>
Wed, 29 Dec 2010 16:39:38 +0000 (17:39 +0100)
committerSascha Wildner <saw@online.de>
Wed, 7 Sep 2011 05:24:30 +0000 (07:24 +0200)
sys/kern/kern_linker.c
sys/sys/linker.h

index 301e109..0a0c740 100644 (file)
@@ -411,6 +411,22 @@ linker_find_file_by_id(int fileid)
     return lf;
 }
 
+int
+linker_file_foreach(linker_predicate_t *predicate, void *context)
+{
+    linker_file_t lf;
+    int retval = 0;
+
+    lockmgr(&lock, LK_SHARED);
+    TAILQ_FOREACH(lf, &linker_files, link) {
+       retval = predicate(lf, context);
+       if (retval != 0)
+           break;
+    }
+    lockmgr(&lock, LK_RELEASE);
+    return (retval);
+}
+
 linker_file_t
 linker_make_file(const char* pathname, void* priv, struct linker_file_ops* ops)
 {
index 3871278..d1e59c2 100644 (file)
@@ -155,6 +155,11 @@ struct linker_class {
     struct linker_class_ops *ops;
 };
 
+/*
+ * Function type used when iterating over the list of linker files.
+ */
+typedef int linker_predicate_t(linker_file_t, void *);
+
 /*
  * The file which is currently loading.  Used to register modules with
  * the files which contain them.
@@ -205,6 +210,13 @@ void linker_file_add_dependancy(linker_file_t _file, linker_file_t _dep);
 
 int linker_load_dependencies(linker_file_t lf);
 
+/*
+ * Iterate over all of the currently loaded linker files calling the
+ * predicate function while the function returns 0.  Returns the value
+ * returned by the last predicate function.
+ */
+int linker_file_foreach(linker_predicate_t *_predicate, void *_context);
+
 /*
  * Lookup a symbol in a file.  If deps is TRUE, look in dependancies
  * if not found in file.  The symbol's value is returned in the