Funzione NdisDprAcquireReadWriteLock (ndis.h)
La funzione NdisDprAcquireReadWriteLock acquisisce un blocco usato dal chiamante per la scrittura o l'accesso in lettura alle risorse condivise tra i thread driver.
Sintassi
void NdisDprAcquireReadWriteLock(
[in, out] PNDIS_RW_LOCK Lock,
[in] BOOLEAN fWrite,
[out] PLOCK_STATE LockState
);
Parametri
[in, out] Lock
Puntatore a una variabile opaca che rappresenta un blocco. Il chiamante può usare questo blocco per accedere alle risorse condivise.
[in] fWrite
Valore booleano. Se il valore è TRUE, questa funzione viene fornita con l'accesso in scrittura alle risorse condivise; se il valore è FALSE, questa funzione viene fornita con l'accesso in lettura.
[out] LockState
Puntatore a una variabile opaca che tiene traccia dello stato del blocco. Questa variabile esiste nell'intervallo compreso tra il momento in cui il chiamante acquisisce e rilascia il blocco. Il chiamante deve usare una variabile diversa di tipo LOCK_STATE per ogni tentativo che esegue per acquisire il blocco dallo stesso thread driver non ISR.
Valore restituito
nessuno
Osservazioni
Il driver deve inizializzare una variabile di tipo NDIS_RW_LOCK usando Funzione NdisInitializeReadWriteLock prima che il driver chiami qualsiasi altra funzione NdisXxxReadWriteLock. Il driver deve fornire l'archiviazione residente per i blocchi usati.
Dopo aver acquisito un blocco usando NdisDprAcquireReadWriteLock, il chiamante deve rilasciare tale blocco chiamando la funzione NdisDprReleaseReadWriteLock . Per decrerere il conteggio dei riferimenti del blocco, un driver deve chiamare
NdisDprReleaseReadWriteLock una volta per ogni chiamata a NdisDprAcquireReadWriteLock.
È sicuro usare sia NdisDprAcquireReadWriteLock che NdisDprAcquireReadWriteLock nello stesso blocco. Tuttavia, le chiamate devono essere bilanciate in modo che se il blocco viene acquisito con NdisDprAcquireReadWriteLock, deve essere rilasciato con NdisDprReleaseReadWriteLock. Analogamente, se il blocco viene acquisito con NdisAcquireReadWriteLock, deve essere rilasciato con NdisReleaseReadWriteLock.
Con alcune architetture, NdisDprAcquireReadWriteLock esegue più velocemente di NdisAcquireReadWriteLock. I driver possono usare NdisDprAcquireReadWriteLock anziché NdisAcquireReadWriteLock quando è certo che il irQL corrente sia già DISPATCH_LEVEL. Tuttavia, non è obbligatorio. Il sovraccarico della chiamata alla funzione KeGetCurrentIrql è maggiore del vantaggio delle prestazioni della chiamata a NdisDprAcquireReadWriteLock anziché NdisAcquireReadWriteLock.
Per modificare le risorse condivise tra i thread driver, un thread driver deve acquisire un blocco di scrittura. Per monitorare semplicemente queste risorse, un thread driver deve acquisire un blocco di sola lettura. L'accesso in lettura non richiede operazioni interlock o contese per i blocchi di spin. L'uso dell'accesso in sola lettura consente di mantenere buone prestazioni del sistema operativo e del driver.
Un thread driver non deve mai contenere un blocco di scrittura per più di 25 microsecondi. Il blocco di scrittura per un periodo prolungato degrada sia le prestazioni del sistema operativo che del driver.
Il driver non può usare un blocco per proteggere le risorse da accesso in lettura o scrittura che le altre funzioni condividono con MiniportInterrupt e/o
Funzioni MiniportDisableInterruptEx . Al contrario, il driver deve chiamare NdisMSynchronizeWithInterruptEx in modo che il relativo driver
La funzione MiniportSynchronizeInterrupt accede a tali risorse condivise allo stesso DIRQL in corrispondenza del quale ha
MiniportInterrupt e/o
Le funzioni MiniportDisableInterruptEx fanno.
Per altre informazioni sull'acquisizione e il rilascio dei blocchi di spin NDIS, vedere Sincronizzazione e notifica nei driver di rete.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Deprecato per i driver NDIS 6.20 e versioni successive, che devono usare NdisAcquireRWLockRead o NdisAcquireRWlockWrite anziché NdisDprAcquireReadWriteLock. Supportato in NDIS 6.0 e 6.1. |
Piattaforma di destinazione | Universale |
Intestazione | ndis.h (includere Ndis.h) |
Libreria | Ndis.lib |
IRQL | = DISPATCH_LEVEL |