[Pdbg] [PATCH 08/23] libpdbg: Child traversal should not include virtual nodes
Amitay Isaacs
amitay at ozlabs.org
Fri Sep 20 15:18:57 AEST 2019
On Thu, 2019-09-19 at 14:02 +1000, Alistair Popple wrote:
> > -struct pdbg_target *__pdbg_next_child_target(struct pdbg_target
> > *parent,
> struct pdbg_target *last)
> > +static struct pdbg_target *pdbg_next_target_match(struct
> > pdbg_target *next,
> bool virtual)
>
> This is really two different functions selected by a flag, although I
> suppose in
> the context it makes sense.
>
> > {
> > - if (!parent || list_empty(&parent->children))
> > + if (virtual) {
> > + if (!next->vnode)
> > + return next;
> > + else
> > + if (!next->compatible)
> > + return next->vnode;
> > + } else {
> > + if (next->compatible)
> > + return next;
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > +struct pdbg_target *__pdbg_next_child_target(struct pdbg_target
> > *parent,
> struct pdbg_target *last, bool virtual)
>
> However do we even need the virtual flag? I couldn't see anything
> that actually
> calls __pdbg_next_child_target() with virtual == false, so perhaps we
> just
> make traversing the system tree the only exported behaviour?
I am using virtual == false in the test code added later to confirm the
backend device tree traversal.
>
> - Alistair
>
> > +{
> > + struct pdbg_target *next, *child = NULL;
> > +
> > + if (!parent)
> > return NULL;
> >
> > - if (!last)
> > - return list_top(&parent->children, struct pdbg_target,
> > list);
> > + if (list_empty(&parent->children)) {
> > + if (parent->vnode)
> > + parent = parent->vnode;
> > + else
> > + return NULL;
> > + }
> > +
> > + if (!last) {
> > + list_for_each(&parent->children, child, list)
> > + if ((next = pdbg_next_target_match(child,
> > virtual)))
> > + return next;
> > +
> > + return NULL;
> > + }
> > +
> > + if (virtual && last->vnode && last->compatible)
> > + last = last->vnode;
> >
> > - if (last->list.next == &parent->children.n)
> > + if (last == list_tail(&parent->children, struct pdbg_target,
> > list))
> > return NULL;
> >
> > - return list_entry(last->list.next, struct pdbg_target, list);
> > + child = last;
> > + do {
> > + child = list_entry(child->list.next, struct
> > pdbg_target, list);
> > + if ((next = pdbg_next_target_match(child, virtual)))
> > + return next;
> > + } while (child != list_tail(&parent->children, struct
> > pdbg_target, list));
> > +
> > + return NULL;
> > }
> >
> > enum pdbg_target_status pdbg_target_status(struct pdbg_target
> > *target)
> > diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h
> > index caf8b85..df74e43 100644
> > --- a/libpdbg/libpdbg.h
> > +++ b/libpdbg/libpdbg.h
> > @@ -20,7 +20,7 @@ struct pdbg_target
> > *__pdbg_next_compatible_node(struct
> pdbg_target *root,
> > struct pdbg_target
> > *prev,
> > const char
> > *compat);
> > struct pdbg_target *__pdbg_next_target(const char *klass, struct
> pdbg_target *parent, struct pdbg_target *last);
> > -struct pdbg_target *__pdbg_next_child_target(struct pdbg_target
> > *parent,
> struct pdbg_target *last);
> > +struct pdbg_target *__pdbg_next_child_target(struct pdbg_target
> > *parent,
> struct pdbg_target *last, bool virtual);
> >
> > /*
> > * Each target has a status associated with it. This is what each
> > status
> means:
> > @@ -71,9 +71,9 @@ enum pdbg_backend { PDBG_DEFAULT_BACKEND = 0,
> PDBG_BACKEND_FSI, PDBG_BACKEND_I2C
> > target = __pdbg_next_target(class, NULL, target))
> >
> > #define pdbg_for_each_child_target(parent, target) \
> > - for (target = __pdbg_next_child_target(parent, NULL); \
> > + for (target = __pdbg_next_child_target(parent, NULL, true); \
> > target; \
> > - target = __pdbg_next_child_target(parent, target))
> > + target = __pdbg_next_child_target(parent, target, true))
> >
> > /* Return the first parent target of the given class, or NULL if
> > the given
> > * target does not have a parent of the given class. */
> >
>
>
>
Amitay.
--
If a glass of wine pleases you, enjoy it for its own sake but do not
pour another glass from the same bottle; it cannot enhance the
experience. Better to try a glass of a different type of wine on a
different day.
More information about the Pdbg
mailing list