投機を使用するときは、speculation() から返される識別子を、節内のデータ記録アクションの前に speculate() 関数に渡す必要があります。1 つの節内で、speculate() 以降に含まれるデータ記録アクションはすべて、投機的にトレースされます。1 つの D プローブ節内で、データ記録アクションのあとに speculate() を呼び出すと、D コンパイラから、コンパイル時エラーが返されます。1 つの節には必ず、投機トレース要求だけ、またはそれ以外のトレース要求だけを含めるようにしてください。同じ節に、投機トレース要求とそれ以外のトレース要求の両方を含めることはできません。
集積アクション、破壊アクション、exit アクションは、投機的に処理することはできません。これらのいずれかのアクションを speculate() と同じ節に含めると、コンパイル時エラーが発生します。同じ節で、複数の speculate() を使用することはできません。speculate() は、節当たり 1 個と決まっています。speculate() 1 個以外に何も含まれない節では、デフォルトのアクション (プローブ ID が有効なプローブのみをトレースする) が投機的にトレースされます。デフォルトアクションについては、第 10 章アクションとサブルーチンを参照してください。
通常、speculation() の結果は、スレッド固有変数に割り当てます。その後は、このスレッド固有変数を、ほかのプローブの述語や speculate() の引数として使用します。次に例を示します。
syscall::open:entry { self->spec = speculation(); } syscall::: /self->spec/ { speculate(self->spec); printf("this is speculative"); }