~ubuntu-branches/debian/stretch/grub2/stretch

« back to all changes in this revision

Viewing changes to kern/dl.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2010-06-15 12:45:35 UTC
  • mto: (1.14.1 upstream) (17.3.18 experimental)
  • mto: This revision was merged to the branch mainline in revision 36.
  • Revision ID: james.westby@ubuntu.com-20100615124535-9vfbis4kzv0h5bgy
Tags: upstream-1.98+20100614
ImportĀ upstreamĀ versionĀ 1.98+20100614

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
 
40
40
 
41
41
 
42
 
struct grub_dl_list
43
 
{
44
 
  struct grub_dl_list *next;
45
 
  grub_dl_t mod;
46
 
};
47
 
typedef struct grub_dl_list *grub_dl_list_t;
48
 
 
49
 
static grub_dl_list_t grub_dl_head;
 
42
grub_dl_t grub_dl_head = 0;
50
43
 
51
44
static grub_err_t
52
45
grub_dl_add (grub_dl_t mod)
53
46
{
54
 
  grub_dl_list_t l;
55
 
 
56
47
  if (grub_dl_get (mod->name))
57
48
    return grub_error (GRUB_ERR_BAD_MODULE,
58
49
                       "`%s' is already loaded", mod->name);
59
50
 
60
 
  l = (grub_dl_list_t) grub_malloc (sizeof (*l));
61
 
  if (! l)
62
 
    return grub_errno;
63
 
 
64
 
  l->mod = mod;
65
 
  l->next = grub_dl_head;
66
 
  grub_dl_head = l;
 
51
  mod->next = grub_dl_head;
 
52
  grub_dl_head = mod;
67
53
 
68
54
  return GRUB_ERR_NONE;
69
55
}
71
57
static void
72
58
grub_dl_remove (grub_dl_t mod)
73
59
{
74
 
  grub_dl_list_t *p, q;
 
60
  grub_dl_t *p, q;
75
61
 
76
62
  for (p = &grub_dl_head, q = *p; q; p = &q->next, q = *p)
77
 
    if (q->mod == mod)
 
63
    if (q == mod)
78
64
      {
79
65
        *p = q->next;
80
 
        grub_free (q);
81
66
        return;
82
67
      }
83
68
}
85
70
grub_dl_t
86
71
grub_dl_get (const char *name)
87
72
{
88
 
  grub_dl_list_t l;
 
73
  grub_dl_t l;
89
74
 
90
75
  for (l = grub_dl_head; l; l = l->next)
91
 
    if (grub_strcmp (name, l->mod->name) == 0)
92
 
      return l->mod;
 
76
    if (grub_strcmp (name, l->name) == 0)
 
77
      return l;
93
78
 
94
79
  return 0;
95
80
}
96
81
 
97
 
void
98
 
grub_dl_iterate (int (*hook) (grub_dl_t mod))
99
 
{
100
 
  grub_dl_list_t l;
101
 
 
102
 
  for (l = grub_dl_head; l; l = l->next)
103
 
    if (hook (l->mod))
104
 
      break;
105
 
}
106
 
 
107
82
 
108
83
 
109
84
struct grub_symbol
694
669
{
695
670
  /* Because grub_dl_remove modifies the list of modules, this
696
671
     implementation is tricky.  */
697
 
  grub_dl_list_t p = grub_dl_head;
 
672
  grub_dl_t p = grub_dl_head;
698
673
 
699
674
  while (p)
700
675
    {
701
 
      if (grub_dl_unload (p->mod))
 
676
      if (grub_dl_unload (p))
702
677
        {
703
678
          p = grub_dl_head;
704
679
          continue;
714
689
{
715
690
  while (grub_dl_head)
716
691
    {
717
 
      grub_dl_list_t p;
 
692
      grub_dl_t p;
718
693
 
719
694
      grub_dl_unload_unneeded ();
720
695
 
721
696
      /* Force to decrement the ref count. This will purge pre-loaded
722
697
         modules and manually inserted modules.  */
723
698
      for (p = grub_dl_head; p; p = p->next)
724
 
        p->mod->ref_count--;
 
699
        p->ref_count--;
725
700
    }
726
701
}