]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Remove grub_dl_iterate
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 26 Mar 2010 23:52:40 +0000 (00:52 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 26 Mar 2010 23:52:40 +0000 (00:52 +0100)
commands/minicmd.c
include/grub/dl.h
kern/dl.c

index 4ea9efead475dfe3accad734411e22bcb5da11fc..92d262cafa1ec209e10c0c6d950919111d0af1ab 100644 (file)
@@ -301,27 +301,23 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
                     int argc __attribute__ ((unused)),
                     char *argv[] __attribute__ ((unused)))
 {
-  auto int print_module (grub_dl_t mod);
-
-  int print_module (grub_dl_t mod)
-    {
-      grub_dl_dep_t dep;
-
-      grub_printf ("%s\t%d\t\t", mod->name, mod->ref_count);
-      for (dep = mod->dep; dep; dep = dep->next)
-       {
-         if (dep != mod->dep)
-           grub_putchar (',');
-
-         grub_printf ("%s", dep->mod->name);
-       }
-      grub_putchar ('\n');
-
-      return 0;
-    }
+  grub_dl_t mod;
 
   grub_printf ("Name\tRef Count\tDependencies\n");
-  grub_dl_iterate (print_module);
+  FOR_DL_MODULES (mod)
+  {
+    grub_dl_dep_t dep;
+
+    grub_printf ("%s\t%d\t\t", mod->name, mod->ref_count);
+    for (dep = mod->dep; dep; dep = dep->next)
+      {
+       if (dep != mod->dep)
+         grub_putchar (',');
+
+       grub_printf ("%s", dep->mod->name);
+      }
+    grub_putchar ('\n');
+  }
 
   return 0;
 }
index 17e03f400b7c91a38b37f887b03ee822150e358f..c44e85aef84fe5e5770755eea42d74c2553cacfb 100644 (file)
@@ -82,6 +82,7 @@ struct grub_dl
   Elf_Sym *symtab;
   void (*init) (struct grub_dl *mod);
   void (*fini) (void);
+  struct grub_dl *next;
 };
 typedef struct grub_dl *grub_dl_t;
 
@@ -113,7 +114,10 @@ grub_dl_unref (grub_dl_t mod)
 int EXPORT_FUNC(grub_dl_ref) (grub_dl_t mod);
 int EXPORT_FUNC(grub_dl_unref) (grub_dl_t mod);
 #endif
-void EXPORT_FUNC(grub_dl_iterate) (int (*hook) (grub_dl_t mod));
+extern grub_dl_t EXPORT_VAR(grub_dl_head);
+
+#define FOR_DL_MODULES(var) FOR_LIST_ELEMENTS ((var), (grub_dl_head))
+
 grub_dl_t EXPORT_FUNC(grub_dl_get) (const char *name);
 grub_err_t grub_dl_register_symbol (const char *name, void *addr,
                                    grub_dl_t mod);
index 19ee13243453c7d62b73805194c440299e7964f9..cf59cec307f97be3cea651204ca60fae5687a63c 100644 (file)
--- a/kern/dl.c
+++ b/kern/dl.c
 
 \f
 
-struct grub_dl_list
-{
-  struct grub_dl_list *next;
-  grub_dl_t mod;
-};
-typedef struct grub_dl_list *grub_dl_list_t;
-
-static grub_dl_list_t grub_dl_head;
+grub_dl_t grub_dl_head = 0;
 
 static grub_err_t
 grub_dl_add (grub_dl_t mod)
 {
-  grub_dl_list_t l;
-
   if (grub_dl_get (mod->name))
     return grub_error (GRUB_ERR_BAD_MODULE,
                       "`%s' is already loaded", mod->name);
 
-  l = (grub_dl_list_t) grub_malloc (sizeof (*l));
-  if (! l)
-    return grub_errno;
-
-  l->mod = mod;
-  l->next = grub_dl_head;
-  grub_dl_head = l;
+  mod->next = grub_dl_head;
+  grub_dl_head = mod;
 
   return GRUB_ERR_NONE;
 }
@@ -71,13 +57,12 @@ grub_dl_add (grub_dl_t mod)
 static void
 grub_dl_remove (grub_dl_t mod)
 {
-  grub_dl_list_t *p, q;
+  grub_dl_t *p, q;
 
   for (p = &grub_dl_head, q = *p; q; p = &q->next, q = *p)
-    if (q->mod == mod)
+    if (q == mod)
       {
        *p = q->next;
-       grub_free (q);
        return;
       }
 }
@@ -85,25 +70,15 @@ grub_dl_remove (grub_dl_t mod)
 grub_dl_t
 grub_dl_get (const char *name)
 {
-  grub_dl_list_t l;
+  grub_dl_t l;
 
   for (l = grub_dl_head; l; l = l->next)
-    if (grub_strcmp (name, l->mod->name) == 0)
-      return l->mod;
+    if (grub_strcmp (name, l->name) == 0)
+      return l;
 
   return 0;
 }
 
-void
-grub_dl_iterate (int (*hook) (grub_dl_t mod))
-{
-  grub_dl_list_t l;
-
-  for (l = grub_dl_head; l; l = l->next)
-    if (hook (l->mod))
-      break;
-}
-
 \f
 
 struct grub_symbol
@@ -690,11 +665,11 @@ grub_dl_unload_unneeded (void)
 {
   /* Because grub_dl_remove modifies the list of modules, this
      implementation is tricky.  */
-  grub_dl_list_t p = grub_dl_head;
+  grub_dl_t p = grub_dl_head;
 
   while (p)
     {
-      if (grub_dl_unload (p->mod))
+      if (grub_dl_unload (p))
        {
          p = grub_dl_head;
          continue;
@@ -710,13 +685,13 @@ grub_dl_unload_all (void)
 {
   while (grub_dl_head)
     {
-      grub_dl_list_t p;
+      grub_dl_t p;
 
       grub_dl_unload_unneeded ();
 
       /* Force to decrement the ref count. This will purge pre-loaded
         modules and manually inserted modules.  */
       for (p = grub_dl_head; p; p = p->next)
-       p->mod->ref_count--;
+       p->ref_count--;
     }
 }