Introduction aux routines ERESOURCE
Le système fournit des routines pour acquérir et publier des structures ERESOURCE, ainsi que pour examiner leur état actuel.
Acquisition et publication d’une structure ERESOURCE
Les pilotes peuvent utiliser les structures ERESOURCE pour implémenter la synchronisation exclusive/partagée. La synchronisation exclusive/partagée fonctionne comme suit :
Un nombre quelconque de threads peut acquérir un ERESOURCE partagé.
Un seul thread peut acquérir un ERESOURCE exclusivement. L’ERESOURCE ne peut être acquis que exclusivement si aucun thread ne l’a déjà acquis comme partagé.
Un thread qui ne peut pas acquérir un ERESOURCE peut éventuellement être placé dans un état d’attente jusqu’à ce que l’ERESOURCE puisse être acquis. Le système gère deux listes de threads en attente d’un ERESOURCE : une liste de serveurs exclusifs et une liste de serveurs partagés.
Une utilisation courante de la synchronisation exclusive/partagée consiste à implémenter un verrou en lecture/écriture. Un verrou en lecture/écriture permet à plusieurs threads d’effectuer une opération de lecture, mais un seul thread peut écrire à la fois. Cela peut être implémenté directement en termes d’acquisition d’un ERESOURCE.
Un pilote alloue le stockage pour un ERESOURCE et l’initialise avec ExInitializeResourceLite. Le système conserve une liste de toutes les structures ERESOURCE en cours d’utilisation. Lorsque le pilote n’a plus besoin d’un ERESOURCE particulier, il doit appeler ExDeleteResourceLite pour le supprimer de la liste du système. Le pilote peut également réutiliser un ERESOURCE en appelant ExReinitializeResourceLite.
Les pilotes peuvent effectuer les opérations de base suivantes sur un ERESOURCE :
Acquérir un ERESOURCE partagé avec ExAcquireResourceSharedLite. Cette routine acquiert la ressource uniquement si la ressource n’a pas été acquise exclusivement et qu’il n’y a pas de serveurs exclusifs.
Acquérir une ERESOURCE exclusivement avec ExAcquireResourceExclusiveLite. Cette routine acquiert la ressource tant qu’elle n’a pas été acquise exclusivement ou partagée.
Convertir une acquisition exclusive en acquisition partagée avec ExConvertExclusiveToSharedLite.
Libérez une ressource acquise avec ExReleaseResourceLite.
Le paramètre Waitd’ExAcquireResourceSharedLite et ExAcquireResourceExclusiveLite détermine si le thread actuel attend l’acquisition de l’ERESOURCE. Si vous spécifiez la valeur FALSE et que l’ERESOURCE ne peut pas être acquis, la routine retourne FALSE. Si vous spécifiez la valeur TRUE, le thread actuel est placé sur la liste d’attente appropriée pour ERESOURCE.
Examen de l’état d’une structure ERESOURCE
Un pilote peut également déterminer l’état actuel d’un ERESOURCE, comme suit :
Utilisez ExIsResourceAcquiredLite ou ExIsResourceAcquiredSharedLite pour déterminer si l’ERESOURCE a déjà été acquis en tant que partagé ou exclusif. Utilisez ExIsResourceAcquiredExclusiveLite pour case activée si l’ERESOURCE a été spécifiquement acquis exclusivement.
Utilisez ExGetSharedWaiterCount pour déterminer le nombre de serveurs partagés pour ERESOURCE, et utilisez ExGetExclusiveWaiterCount pour déterminer le nombre de serveurs exclusifs pour l’ERESOURCE.