Post by Lida HornI'm looking for an example of how one could write a dtrace probe
that could follow something like a NULL terminated linked list.
struct list {
struct list *next;
void *data;
};
struct list *list_root;
Assuming I had "list_root" available, but I wanted to know how long
the linked list is, how can I do this in a dtrace probe?
int
count_list(struct list *list)
{
int i;
for (i = 0; list != NULL; list = list->next)
++i;
return i;
}
In the dtrace scripting language there are no loop constructs, but is
there a way to add a new provider than can loop?
Generally, you can do this using something like:
my:probe:matching:func
{
this->list = /* some way to get initial list */;
this->length = 0;
}
my:probe:matching:func / this->list != NULL / {
this->list = this->list->next; this->length++;
}
my:probe:matching:func / this->list != NULL / {
this->list = this->list->next; this->length++;
}
my:probe:matching:func / this->list != NULL / {
this->list = this->list->next; this->length++;
}
my:probe:matching:func / this->list != NULL / {
this->list = this->list->next; this->length++;
}
/* repeat N times, where N is the max list length */
my:probe:matching:func / this->list != NULL / {
/* list was longer than our maximum length */
@overflow = count();
}
my:probe:matching:func / this->list == NULL / {
/* use this->count as the length of the list */
}
(Enablings for a probe are guaranteed to execute in program order, and this->
variables are valid between enablings of the same probe.)
Cheers,
- jonathan