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.
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 em seu driver.
Estrutura de recursos ERESOURCE
A estrutura ERESOURCE é utilizada para gerir o acesso a recursos partilhados. Ele fornece um mecanismo para sincronizar o acesso a recursos que podem ser compartilhados entre vários threads.
A estrutura do ERESOURCE é opaca; ou seja, seus membros são reservados para uso do sistema.
O armazenamento para ERESOURCE deve ser alocado a partir de pool não paginado.
Rotinas de ERESOURCE
O sistema fornece rotinas para adquirir e liberar estruturas ERESOURCE e examinar seu estado atual.
Aquisição e liberação de uma 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 como compartilhado.
Apenas um thread pode adquirir um ERESOURCE exclusivamente. O ERESOURCE só pode ser adquirido exclusivamente se nenhum thread já o adquiriu como compartilhado.
Um thread que não pode atualmente adquirir um ERESOURCE pode, opcionalmente, 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 à espera de um ERESOURCE: uma lista de esperas exclusivas e uma lista de esperas compartilhadas.
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 de cada vez. Este 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 determinado ERESOURCE, 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 da mesma forma que ExAcquireResourceSharedLite faz. Essa rotina só adquire o recurso se o recurso não foi adquirido exclusivamente e não há garçons exclusivos.
Adquira um ERESOURCE de forma exclusiva com ExAcquireResourceExclusiveLite. Essa rotina adquire o recurso desde 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 o 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 recurso E, da seguinte maneira:
Use ExIsResourceAcquiredLite ou ExIsResourceAcquiredSharedLite para determinar se o ERESOURCE já foi adquirido como compartilhado ou exclusivo. Use ExIsResourceAcquiredExclusiveLite para verificar se o ERESOURCE foi adquirido de forma exclusiva.
Use ExGetSharedWaiterCount para determinar o número de esperas partilhadas para o ERESOURCE e use ExGetExclusiveWaiterCount para determinar o número de esperas exclusivas para o ERESOURCE.