Introduzione alle routine ERESOURCE
Il sistema fornisce routine per acquisire e rilasciare strutture ERESOURCE, nonché per esaminare lo stato corrente.
Acquisizione e rilascio di una struttura ERESOURCE
I driver possono usare le strutture ERESOURCE per implementare la sincronizzazione esclusiva/condivisa. La sincronizzazione esclusiva/condivisa funziona come segue:
Qualsiasi numero di thread può acquisire un ERESOURCE come condiviso.
Un solo thread può acquisire esclusivamente un ERESOURCE. L'ERESOURCE può essere acquisito esclusivamente se non sono già stati acquisiti thread come condivisi.
Un thread che attualmente non può acquisire un ERESOURCE può essere inserito facoltativamente in uno stato di attesa fino a quando non è possibile acquisire ERESOURCE. Il sistema gestisce due elenchi di thread in attesa di un'ERESOURCE: un elenco di camerieri esclusivi e un elenco di camerieri condivisi.
Un uso tipico per la sincronizzazione esclusiva/condivisa consiste nell'implementare un blocco di lettura/scrittura. Un blocco di lettura/scrittura consente a diversi thread di eseguire un'operazione di lettura, ma solo un thread può scrivere alla volta. Questa operazione può essere implementata direttamente in termini di acquisizione di un'ERESOURCE.
Un driver alloca lo spazio di archiviazione per un ERESOURCE e lo inizializza con ExInitializeResourceLite. Il sistema gestisce un elenco di tutte le strutture ERESOURCE in uso. Quando il driver non richiede più un determinato ERESOURCE, deve chiamare ExDeleteResourceLite per eliminarlo dall'elenco del sistema. Il driver può anche riutilizzare un ERESOURCE chiamando ExReinitializeResourceLite.
I driver possono eseguire le operazioni di base seguenti su un'ERESOURCE:
Acquisire un ERESOURCE come condiviso con ExAcquireResourceSharedLite. Questa routine acquisisce la risorsa solo se la risorsa non è stata acquisita esclusivamente e non sono presenti camerieri esclusivi.
Acquisire un ERESOURCE esclusivamente con ExAcquireResourceExclusiveLite. Questa routine acquisisce la risorsa purché non sia stata acquisita esclusivamente o come condivisa.
Convertire un'acquisizione esclusiva in un'acquisizione condivisa con ExConvertExclusiveToSharedLite.
Rilasciare una risorsa acquisita con ExReleaseResourceLite.
Il parametro Wait di ExAcquireResourceSharedLite e ExAcquireResourceExclusiveLite determina se il thread corrente attende l'acquisizione di ERESOURCE. Se si specifica un valore false e non è possibile acquisire ERESOURCE, la routine restituisce FALSE. Se si specifica un valore true, il thread corrente viene inserito nell'elenco di attesa appropriato per ERESOURCE.
Esame dello stato di una struttura ERESOURCE
Un driver può anche determinare lo stato corrente di un'ERESOURCE, come indicato di seguito:
Usare ExIsResourceAcquiredLite o ExIsResourceAcquiredSharedLite per determinare se ERESOURCE è già stato acquisito come condiviso o esclusivo. Usare ExIsResourceAcquiredExclusiveLite per verificare se ERESOURCE è stato acquisito esclusivamente.
Usare ExGetSharedWaiterCount per determinare il numero di camerieri condivisi per ERESOURCE e usare ExGetExclusiveWaiterCount per determinare il numero di camerieri esclusivi per ERESOURCE.