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