Solaris 動的トレースガイド

投機の使用

投機を使用するときは、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");
}