Guía de seguimiento dinámico de Solaris

Uso de una especulación

Para utilizar una especulación, el identificador devuelto por speculation() debe transferirse a la función speculate() en una cláusula antes de llevar a cabo cualquier acción de registro de datos. Se realizará un seguimiento especulativo de todas las acciones de registro de datos siguientes de la cláusula que contenga una función speculate. () El compilador del lenguaje D generará un error de tiempo de compilación si la llamada a speculate() es posterior a las acciones de registro de datos en una cláusula de sondeo de D. Por lo tanto, las cláusulas pueden contener solicitudes de seguimiento especulativo o no especulativo, pero no ambas.

Las acciones de adición, las acciones destructivas y la acción exit nunca pueden ser especulativas. Cualquier intento de realizar una de estas acciones en una cláusula que contenga una función speculate() provocará un error de tiempo de compilación. La función speculate() no puede ir detrás de otra función speculate(): sólo se permite una especulación por cláusula. Una cláusula que contenga sólo una función speculate() realizará un seguimiento especulativo de la acción predeterminada, que se define para realizar un seguimiento sólo del Id. de sondeo habilitado. Consulte le Capítulo 10Acciones y subrutinas, para obtener una descripción de la acción predeterminada.

Normalmente, debe asignar el resultado de una función speculation() a una variable de subproceso local y, a continuación, utilizar esa variable como predicado subsiguiente de otros sondeos, así como un argumento para speculate(). Por ejemplo:

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

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