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 generates a compile-time error if a call to speculate() follows data recording actions in a D probe clause. Therefore, clauses may contain either speculative tracing or non-speculative tracing requests.

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() function must not follow a speculate() function. You can use only one speculation 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. For information about the default action, see DTrace Actions and Subroutines.

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::openat:entry
{
        self->spec = speculation();
}

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