Manuel de suivi dynamique Solaris

Utilisation d'une spéculation

Pour utiliser une spéculation, un identificateur retourné par une fonction speculation() doit être transféré à une fonction speculate() dans une clause avant toute action d'enregistrement des données. Toutes les actions d'enregistrement de données ultérieures dans une clause contenant une fonction speculate() feront l'objet d'un suivi spéculatif. Le compilateur D générera une erreur de durée de compilation si un appel de la fonction speculate() suit les actions d'enregistrement des données dans une clause de la sonde D. Par conséquent, les clauses peuvent contenir des requêtes de suivi spéculatif ou non-spéculatif, mais pas les deux.

Les actions d'agrégation, de destruction et exit peuvent ne jamais être spéculatives. Essayer d'entreprendre l'une de ces actions dans une clause contenant une fonction speculate() provoque une erreur de durée de compilation. Une fonction speculate() ne suit pas forcément une fonction speculate() : une clause ne peut contenir qu'une spéculation. Une clause contenant une seule fonction speculate() suit l'action par défaut de manière spéculative, cette action étant configurée pour ne suivre que l'ID de la sonde activée. Pour plus d'informations sur l'action par défaut, reportez-vous au Chapitre10Actions et sous-routines.

En règle générale, vous affectez le résultat d'une fonction speculation() à une variable de thread locale, puis vous utilisez cette variable comme prédicat ultérieur à d'autres sondes, ainsi que comme argument à la fonction speculate(). Exemple :

syscall::open:entry
{
	self->spec = speculation();
}

syscall:::
/self->spec/
{
	speculate(self->spec);
	printf("this is speculative");
}