Rotina de execução de contexto do servidor

Se a comunicação for interrompida enquanto o servidor estiver mantendo o contexto em nome do cliente, uma rotina de limpeza poderá ser necessária para limpo o estado mantido pelo servidor em nome de um determinado cliente. Essa rotina de limpeza é chamada de rotina de execução de contexto. Quando uma conexão for interrompida, o stub do servidor e a biblioteca em tempo de execução chamarão essa rotina em cada identificador de contexto aberto pelo cliente.

A rotina de execução de contexto é necessária e é declarada implicitamente e nomeada quando você aplica o atributo [context_handle] a uma definição de tipo. O servidor não chamará a rotina de execução de contexto se o atributo [context_handle] tiver sido aplicado diretamente a um parâmetro.

A sintaxe de rotina de execução 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 execução 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 contexto e desenvolvimento de cliente usando identificadores de contexto. Esse 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 execução. O tempo de execução do RPC limpa seu estado, independentemente de o identificador de contexto ser 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);
}