Guia de rastreamento dinâmico Solaris

Variáveis de cláusula locais

Você também pode definir as variáveis de D cujo armazenamento é reutilizado em cada cláusula do programa em D. As variáveis de cláusula locais são semelhantes às variáveis automáticas em um programa da linguagem C, C++ ou Java que estão ativas durante cada chamada de uma função. Como todas as variáveis de programa em D, as variáveis de cláusula locais são criadas na primeira atribuição. Essas variáveis podem ser referenciadas e atribuídas por meio da aplicação do operador -> ao identificador especial this:

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

Se você quiser declarar explicitamente uma variável de cláusula local antes de usá-la, use a palavra-chave this:

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

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

As variáveis de cláusula locais só ficam ativas durante um ciclo de vida de uma determinada cláusula de teste. Depois que o DTrace realiza as ações associadas às suas cláusulas em um determinado teste, o armazenamento de todas as variáveis de cláusula locais é recuperado e reutilizado pela próxima cláusula. Por isso, as variáveis de cláusula locais são as únicas variáveis D que não são inicialmente preenchidas com zeros. Observe que se o seu programa contiver várias cláusulas de um único teste, quaisquer variáveis de cláusula locais permanecerão intactas quando as cláusulas forem executadas, como mostrado no exemplo seguinte:


Exemplo 3–2 clause.d: variáveis de cláusula locais

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++);
}

Como as cláusulas são sempre executadas na ordem do programa, e já que as variáveis de cláusula locais persistem entre cláusulas diferentes, ativando o mesmo teste, executar o programa acima sempre produzirá a mesma saída:


# 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

Enquanto as variáveis de cláusula locais são persistentes entre as cláusulas, ativando o mesmo teste, seus valores são indefinidos na primeira cláusula executada em um determinado teste. Esteja certo de atribuir um valor apropriado a cada variável de cláusula local antes de usá-la, ou seu programa poderá ter resultados inesperados.

As variáveis de cláusula locais podem ser definidas por meio de qualquer tipo de variável escalar, mas as matrizes de associação não podem ser definidas através de escopo de cláusula local. O escopo de variáveis de cláusula locais só se aplica aos dados da variável correspondente, não ao nome e à identidade de tipo definidos para a variável. Quando uma variável de cláusula local é definida, este nome e assinatura de tipo podem ser usados em qualquer cláusula do programa em D subseqüente. Você não pode contar que o local de armazenamento seja o mesmo entre cláusulas diferentes.

Você pode usar variáveis de cláusula globais para acumular resultados intermediários de cálculos ou como cópia de outras variáveis. O acesso a uma variável de cláusula global é muito mais rápido do que o acesso a uma matriz de associação. Portanto, se você precisar fazer referência a um valor de matriz de associação várias vezes na mesma cláusula do programa em D, é mais eficaz copiá-la primeiro para uma variável de cláusula local e, em seguida, referenciar a variável locai repetidamente.