Remove grub_dl_iterate
This commit is contained in:
parent
9eade9dbd7
commit
fcaae9ec12
3 changed files with 32 additions and 57 deletions
|
@ -301,27 +301,23 @@ grub_mini_cmd_lsmod (struct grub_command *cmd __attribute__ ((unused)),
|
||||||
int argc __attribute__ ((unused)),
|
int argc __attribute__ ((unused)),
|
||||||
char *argv[] __attribute__ ((unused)))
|
char *argv[] __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
auto int print_module (grub_dl_t mod);
|
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_printf ("Name\tRef Count\tDependencies\n");
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,7 @@ struct grub_dl
|
||||||
Elf_Sym *symtab;
|
Elf_Sym *symtab;
|
||||||
void (*init) (struct grub_dl *mod);
|
void (*init) (struct grub_dl *mod);
|
||||||
void (*fini) (void);
|
void (*fini) (void);
|
||||||
|
struct grub_dl *next;
|
||||||
};
|
};
|
||||||
typedef struct grub_dl *grub_dl_t;
|
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_ref) (grub_dl_t mod);
|
||||||
int EXPORT_FUNC(grub_dl_unref) (grub_dl_t mod);
|
int EXPORT_FUNC(grub_dl_unref) (grub_dl_t mod);
|
||||||
#endif
|
#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_dl_t EXPORT_FUNC(grub_dl_get) (const char *name);
|
||||||
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
||||||
grub_dl_t mod);
|
grub_dl_t mod);
|
||||||
|
|
49
kern/dl.c
49
kern/dl.c
|
@ -39,31 +39,17 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct grub_dl_list
|
grub_dl_t grub_dl_head = 0;
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_dl_add (grub_dl_t mod)
|
grub_dl_add (grub_dl_t mod)
|
||||||
{
|
{
|
||||||
grub_dl_list_t l;
|
|
||||||
|
|
||||||
if (grub_dl_get (mod->name))
|
if (grub_dl_get (mod->name))
|
||||||
return grub_error (GRUB_ERR_BAD_MODULE,
|
return grub_error (GRUB_ERR_BAD_MODULE,
|
||||||
"`%s' is already loaded", mod->name);
|
"`%s' is already loaded", mod->name);
|
||||||
|
|
||||||
l = (grub_dl_list_t) grub_malloc (sizeof (*l));
|
mod->next = grub_dl_head;
|
||||||
if (! l)
|
grub_dl_head = mod;
|
||||||
return grub_errno;
|
|
||||||
|
|
||||||
l->mod = mod;
|
|
||||||
l->next = grub_dl_head;
|
|
||||||
grub_dl_head = l;
|
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
@ -71,13 +57,12 @@ grub_dl_add (grub_dl_t mod)
|
||||||
static void
|
static void
|
||||||
grub_dl_remove (grub_dl_t mod)
|
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)
|
for (p = &grub_dl_head, q = *p; q; p = &q->next, q = *p)
|
||||||
if (q->mod == mod)
|
if (q == mod)
|
||||||
{
|
{
|
||||||
*p = q->next;
|
*p = q->next;
|
||||||
grub_free (q);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -85,25 +70,15 @@ grub_dl_remove (grub_dl_t mod)
|
||||||
grub_dl_t
|
grub_dl_t
|
||||||
grub_dl_get (const char *name)
|
grub_dl_get (const char *name)
|
||||||
{
|
{
|
||||||
grub_dl_list_t l;
|
grub_dl_t l;
|
||||||
|
|
||||||
for (l = grub_dl_head; l; l = l->next)
|
for (l = grub_dl_head; l; l = l->next)
|
||||||
if (grub_strcmp (name, l->mod->name) == 0)
|
if (grub_strcmp (name, l->name) == 0)
|
||||||
return l->mod;
|
return l;
|
||||||
|
|
||||||
return 0;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct grub_symbol
|
struct grub_symbol
|
||||||
|
@ -690,11 +665,11 @@ grub_dl_unload_unneeded (void)
|
||||||
{
|
{
|
||||||
/* Because grub_dl_remove modifies the list of modules, this
|
/* Because grub_dl_remove modifies the list of modules, this
|
||||||
implementation is tricky. */
|
implementation is tricky. */
|
||||||
grub_dl_list_t p = grub_dl_head;
|
grub_dl_t p = grub_dl_head;
|
||||||
|
|
||||||
while (p)
|
while (p)
|
||||||
{
|
{
|
||||||
if (grub_dl_unload (p->mod))
|
if (grub_dl_unload (p))
|
||||||
{
|
{
|
||||||
p = grub_dl_head;
|
p = grub_dl_head;
|
||||||
continue;
|
continue;
|
||||||
|
@ -710,13 +685,13 @@ grub_dl_unload_all (void)
|
||||||
{
|
{
|
||||||
while (grub_dl_head)
|
while (grub_dl_head)
|
||||||
{
|
{
|
||||||
grub_dl_list_t p;
|
grub_dl_t p;
|
||||||
|
|
||||||
grub_dl_unload_unneeded ();
|
grub_dl_unload_unneeded ();
|
||||||
|
|
||||||
/* Force to decrement the ref count. This will purge pre-loaded
|
/* Force to decrement the ref count. This will purge pre-loaded
|
||||||
modules and manually inserted modules. */
|
modules and manually inserted modules. */
|
||||||
for (p = grub_dl_head; p; p = p->next)
|
for (p = grub_dl_head; p; p = p->next)
|
||||||
p->mod->ref_count--;
|
p->ref_count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue