Introdução às rotinas ERESOURCE
O sistema fornece rotinas para adquirir e liberar estruturas ERESOURCE, bem como examinar seu estado atual.
Adquirir e liberar 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 conforme compartilhado.
Somente um thread pode adquirir um ERESOURCE exclusivamente. O ERESOURCE só poderá ser adquirido exclusivamente se nenhum thread já o tiver adquirido como compartilhado.
Um thread que atualmente não pode 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 aguardando um ERESOURCE: uma lista de garçons exclusivos e uma lista de garçons 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. Isso 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 exigir mais um ERESOURCE específico, ele deverá 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 conforme compartilhado com ExAcquireResourceSharedLite. Essa rotina adquire o recurso somente se o recurso não tiver sido adquirido exclusivamente e não houver garçons exclusivos.
Adquira um ERESOURCE exclusivamente com ExAcquireResourceExclusiveLite. Essa rotina adquire o recurso desde que ele não tenha sido adquirido exclusivamente ou como compartilhado.
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 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:
Use ExIsResourceAcquiredLite ou ExIsResourceAcquiredSharedLite para determinar se o ERESOURCE já foi adquirido como compartilhado ou exclusivo. Use ExIsResourceAcquiredExclusiveLite para marcar se o ERESOURCE foi adquirido exclusivamente.
Use ExGetSharedWaiterCount para determinar o número de garçons compartilhados para o ERESOURCE e use ExGetExclusiveWaiterCount para determinar o número de garçons exclusivos para o ERESOURCE.