Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Se a comunicação falhar enquanto o servidor está mantendo o contexto em nome do cliente, uma rotina de limpeza pode ser necessária para limpar o estado mantido pelo servidor em nome de um determinado cliente. Essa rotina de limpeza é chamada de rotina de de contexto. Quando uma conexão é interrompida, o stub do servidor e a biblioteca de tempo de execução chamarão essa rotina em cada identificador de contexto aberto pelo cliente.
A rotina de resumo de contexto é necessária, e é implicitamente declarada e nomeada, quando você aplica o atributo [context_handle] a uma definição de tipo. O servidor não chamará a rotina de resumo de contexto se o atributo [context_handle] tiver sido aplicado diretamente a um parâmetro.
A sintaxe de rotina de resumo de contexto é:
void __RPC_USER type-id_rundown (type-id);
Observe que o nome do tipo determina o nome da rotina de execução de contexto.
O fragmento de código a seguir apresenta uma rotina de resumo de contexto de exemplo. que chama o procedimento RemoteClose usado no exemplo em Desenvolvimento de Interface Usando Identificadores de Contexto, Desenvolvimento de Servidor Usando Identificadores de Contextoe Desenvolvimento de Cliente Usando Identificadores de Contexto. Este procedimento fecha o identificador de arquivo, libera a memória associada ao arquivo e atribui NULL ao identificador de contexto. A atribuição de NULL é resultado da chamada da função RemoteClose e não é necessária em um cenário de degradação. O tempo de execução RPC limpa seu estado, independentemente de o identificador de contexto estar definido como NULL.
//file: cxhndp.c (fragment of file containing remote procedures)
//The rundown routine is associated with the context handle type.
void __RPC_USER PCONTEXT_HANDLE_TYPE_rundown(
PCONTEXT_HANDLE_TYPE phContext)
{
printf("Client died with an open file, closing it..\n");
RemoteClose(&phContext);
assert(phContext == 0);
}