Compartilhar via


Estrutura e rotinas ERESOURCE

Este artigo descreve a estrutura ERESOURCE e as rotinas fornecidas pelo sistema que operam nela. Você pode usar estruturas ERESOURCE para implementar o bloqueio de leitura/gravação no driver.

Estrutura ERESOURCE

A estrutura ERESOURCE é usada para gerenciar o acesso aos recursos compartilhados. Ele fornece um mecanismo para sincronizar o acesso a recursos que podem ser compartilhados entre vários threads.

A estrutura ERESOURCE é opaca; ou seja, seus membros são reservados para uso do sistema.

O armazenamento para ERESOURCE deve ser alocado do pool de memória não paginada.

Rotinas de ERESOURCE

O sistema fornece rotinas para adquirir e liberar estruturas ERESOURCE e examinar seu estado atual.

Adquirir e liberar a estrutura ERESOURCE

Os drivers podem usar as estruturas ERESOURCE para implementar a sincronização exclusiva/compartilhada. A sincronização exclusiva/compartilhada funciona da seguinte maneira:

  • Qualquer número de threads pode adquirir um ERESOURCE em modo compartilhado.

  • Somente um thread pode adquirir um ERESOURCE exclusivamente. O ERESOURCE pode ser adquirido exclusivamente se nenhum dos threads já o tiver adquirido de forma compartilhada.

Um thread que atualmente não pode adquirir um ERESOURCE pode ser colocado em um estado de espera até que o ERESOURCE possa ser adquirido. O sistema mantém duas listas de threads que estão aguardando um ERESOURCE: uma lista de esperadores exclusivos e uma lista de esperadores compartilhados.

Um uso típico para sincronização exclusiva/compartilhada é implementar um bloqueio de leitura/gravação. Um bloqueio de leitura/gravação permite que vários threads executem uma operação de leitura, mas apenas um thread pode gravar por vez. Esse cenário pode ser implementado diretamente em termos de aquisição de um ERESOURCE.

Um driver aloca o armazenamento para um ERESOURCE e o inicializa com ExInitializeResourceLite. O sistema mantém uma lista de todas as estruturas ERESOURCE em uso. Quando o driver não requer mais um ERESOURCE específico, ele deve chamar ExDeleteResourceLite para excluí-lo da lista do sistema. O driver também pode reutilizar um ERESOURCE chamando ExReinitializeResourceLite.

Os drivers podem executar as seguintes operações básicas em um ERESOURCE:

  • Adquira um ERESOURCE compartilhado como ExAcquireResourceSharedLite. Essa rotina adquirirá o recurso somente se o recurso não tiver sido adquirido exclusivamente e não houver garçons exclusivos.

  • Adquira um ERESOURCE de forma exclusiva com ExAcquireResourceExclusiveLite. Essa rotina adquire o recurso, contanto que ele não tenha sido adquirido de forma exclusiva ou compartilhada.

  • Converta uma aquisição exclusiva em uma aquisição compartilhada com ExConvertExclusiveToSharedLite.

  • Libere um recurso adquirido com ExReleaseResourceLite.

O parâmetro Wait de ExAcquireResourceSharedLite e ExAcquireResourceExclusiveLite determina se o thread atual aguarda a aquisição do ERESOURCE. Se você especificar um valor de FALSE e o ERESOURCE não puder ser adquirido, a rotina retornará FALSE. Se você especificar um valor de TRUE, o thread atual será colocado na lista de espera apropriada para o ERESOURCE.

Examinando o estado de uma estrutura ERESOURCE

Um driver também pode determinar o estado atual de um ERESOURCE, da seguinte maneira: