Using a Speculation
To use a speculation, an identifier returned from speculation() must be passed
to the speculate() function in a clause before any data-recording actions. All subsequent data-recording
actions in a clause containing a speculate() will be speculatively traced. The D
compiler will generate a compile-time error if a call to speculate() follows data
recording actions in a D probe clause. Therefore, clauses may contain speculative tracing
or non-speculative tracing requests, but not both.
Aggregating actions, destructive actions, and the exit action may never be speculative. Any
attempt to take one of these actions in a clause containing a speculate()
results in a compile-time error. A speculate() may not follow a speculate(): only one
speculation is permitted per clause. A clause that contains only a speculate()
will speculatively trace the default action, which is defined to trace only the
enabled probe ID. See Chapter 10, Actions and Subroutines for a description of the default action.
Typically, you assign the result of speculation() to a thread-local variable and then
use that variable as a subsequent predicate to other probes as well as
an argument to speculate(). For example:
syscall::open:entry
{
self->spec = speculation();
}
syscall:::
/self->spec/
{
speculate(self->spec);
printf("this is speculative");
}