On Fri, Aug 19, 2011 at 01:34:36PM -0700, Lida Horn wrote:
> I'm looking for an example of how one could write a dtrace probe
> that could follow something like a NULL terminated linked list.
> 
> For example:
> 
> 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?
> 
> If I had looping constructs, it would be obvious:
> 
> 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

_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to