Introducción a las rutinas de ERESOURCE
El sistema proporciona rutinas para adquirir y liberar estructuras ERESOURCE, así como para examinar su estado actual.
Adquisición y liberación de una estructura ERESOURCE
Los controladores pueden usar las estructuras ERESOURCE para implementar la sincronización exclusiva o compartida. La sincronización exclusiva o compartida funciona de la siguiente manera:
Cualquier número de subprocesos puede adquirir un ERESOURCE como compartido.
Solo un subproceso puede adquirir un ERESOURCE exclusivamente. El ERESOURCE solo se puede adquirir exclusivamente si no hay subprocesos ya adquiridos como compartidos.
Un subproceso que actualmente no puede adquirir un ERESOURCE puede colocarse opcionalmente en un estado de espera hasta que se pueda adquirir el ERESOURCE. El sistema mantiene dos listas de subprocesos que están esperando un ERESOURCE: una lista de camareros exclusivos y una lista de camareros compartidos.
Un uso típico para la sincronización exclusiva o compartida es implementar un bloqueo de lectura y escritura. Un bloqueo de lectura y escritura permite que varios subprocesos realicen una operación de lectura, pero solo un subproceso puede escribir a la vez. Esto se puede implementar directamente en términos de adquirir un ERESOURCE.
Un controlador asigna el almacenamiento para un ERESOURCE y lo inicializa con ExInitializeResourceLite. El sistema mantiene una lista de todas las estructuras ERESOURCE en uso. Cuando el controlador ya no requiere un ERESOURCE determinado, debe llamar a ExDeleteResourceLite para eliminarlo de la lista del sistema. El controlador también puede reutilizar un ERESOURCE llamando a ExReinitializeResourceLite.
Los controladores pueden realizar las siguientes operaciones básicas en un ERESOURCE:
Adquiera un ERESOURCE como compartido con ExAcquireResourceSharedLite. Esta rutina adquiere el recurso solo si el recurso no se ha adquirido exclusivamente y no hay camareros exclusivos.
Adquiera un ERESOURCE exclusivamente con ExAcquireResourceExclusiveLite. Esta rutina adquiere el recurso siempre y cuando no se haya adquirido exclusivamente o como compartido.
Convierta una adquisición exclusiva en una adquisición compartida con ExConvertExclusiveToSharedLite.
Libere un recurso adquirido con ExReleaseResourceLite.
El parámetro Wait de ExAcquireResourceSharedLite y ExAcquireResourceExclusiveLite determina si el subproceso actual espera a que se adquiera el ERESOURCE. Si especifica un valor de FALSE y no se puede adquirir ERESOURCE, la rutina devuelve FALSE. Si especifica un valor de TRUE, el subproceso actual se coloca en la lista de espera adecuada para el ERESOURCE.
Examen del estado de una estructura ERESOURCE
Un controlador también puede determinar el estado actual de un ERESOURCE, como se indica a continuación:
Use ExIsResourceAcquiredLite o ExIsResourceAcquiredSharedLite para determinar si el ERESOURCE ya se ha adquirido como compartido o exclusivo. Use ExIsResourceAcquiredExclusiveLite para comprobar si ERESOURCE se ha adquirido específicamente exclusivamente.
Use ExGetSharedWaiterCount para determinar el número de camareros compartidos para el ERESOURCE y use ExGetExclusiveWaiterCount para determinar el número de camareros exclusivos para el ERESOURCE.