Guía de seguimiento dinámico de Solaris

Variables de cláusulas locales

También puede definir variables de D cuyo almacenamiento se vuelva a utilizar para cada cláusula del programa escrito en D. Las variables de cláusulas locales son parecidas a las variables automáticas escritas en lenguaje de programación C, C++ o Java que están activas durante cada invocación de una función. Al igual que todas las variables de un programa escrito en D, las variables de cláusulas locales se crean en su primera asignación. A estas variables se les puede hacer referencia (y se pueden asignar) aplicando el operador -> al identificador especial this:

BEGIN
{
	this->secs = timestamp / 1000000000;
	...
}

Si desea declarar explícitamente variables de cláusulas locales antes de usarlas, puede hacerlo usando la palabra clave this:

this int x;   /* an integer clause-local variable */
this char c;  /* a character clause-local variable */

BEGIN
{
	this->x = 123;
	this->c = 'D';
}

Las variables de cláusulas locales están activas sólo mientras dure una cláusula de sondeo concreta. Después de que DTrace realice las acciones asociadas a las cláusulas para un sondeo determinado, el almacenamiento de todas las variables de cláusulas locales se reclama y se reutiliza para la siguiente cláusula. Por esta razón, las variables de cláusulas locales son las únicas variables de D que no se cumplimentan inicialmente con ceros. Tenga en cuenta que si un programa contiene varias cláusulas para un mismo sondeo, las variables de cláusulas locales permanecerán intactas mientras se ejecutan las cláusulas, tal y como se muestra en el siguiente ejemplo:


Ejemplo 3–2 clause.d: variables de cláusulas locales

int me;			/* an integer global variable */
this int foo;		/* an integer clause-local variable */

tick-1sec
{
	/*
	 * Set foo to be 10 if and only if this is the first clause executed.
	 */
	this->foo = (me % 3 == 0) ? 10 : this->foo;
	printf("Clause 1 is number %d; foo is %d\n", me++ % 3, this->foo++);
}

tick-1sec
{
	/*
	 * Set foo to be 20 if and only if this is the first clause executed. 
	 */
	this->foo = (me % 3 == 0) ? 20 : this->foo;
	printf("Clause 2 is number %d; foo is %d\n", me++ % 3, this->foo++);
}

tick-1sec
{
	/*
	 * Set foo to be 30 if and only if this is the first clause executed.
	 */
	this->foo = (me % 3 == 0) ? 30 : this->foo;
	printf("Clause 3 is number %d; foo is %d\n", me++ % 3, this->foo++);
}

Dado que las cláusulas siempre se ejecutan en el orden de los programas y como las variables de cláusulas locales son persistentes entre las diferentes cláusulas que activan el mismo sondeo, la ejecución de los programas anteriores generará siempre el mismo resultado:


# dtrace -q -s clause.d
Clause 1 is number 0; foo is 10
Clause 2 is number 1; foo is 11
Clause 3 is number 2; foo is 12
Clause 1 is number 0; foo is 10
Clause 2 is number 1; foo is 11
Clause 3 is number 2; foo is 12
Clause 1 is number 0; foo is 10
Clause 2 is number 1; foo is 11
Clause 3 is number 2; foo is 12
Clause 1 is number 0; foo is 10
Clause 2 is number 1; foo is 11
Clause 3 is number 2; foo is 12
^C

Mientras que las variables de cláusulas locales son persistentes entre las distintas cláusulas que activan el mismo sondeo, sus valores están sin definir en la primera cláusula ejecutada para un sondeo concreto. Asegúrese de asignar a la misma variable de cláusula local un valor adecuado antes de usarla; de lo contrario, el programa generará resultados inesperados.

Las variables de cláusulas locales se pueden definir usando un tipo de variable escalar, pero las matrices asociativas puede que no estén definidas usando un ámbito de cláusula local. El ámbito de las variables de cláusulas locales sólo se aplica a los datos de variables correspondientes, no al nombre y al tipo de identidad definido para la variable. Una vez que se define una variable de cláusula local, este nombre y firma de tipo puede usarse en cualquier cláusula de programa escrito en D posterior. No se puede esperar que la ubicación de almacenamiento sea la misma en cláusulas distintas.

Puede usar las variables de cláusulas locales para acumular resultados intermedios de cálculos o como copias temporales de otras variables. Acceder a una variable de cláusula local es mucho más rápido que acceder a una matriz asociativa. En consecuencia, si necesita hacer referencia a un valor de una matriz asociativa varias veces en una misma cláusula de programa escrito en D, es más eficaz copiarlo en una variable de cláusula local primero y luego hacer referencia varias veces a dicha variable local.