Функция NdisDprAcquireReadWriteLock (ndis.h)
Функция NdisDprAcquireReadWriteLock получает блокировку, которую вызывающий объект использует для записи или чтения доступа к ресурсам, которые совместно используются потоками драйвера.
Синтаксис
void NdisDprAcquireReadWriteLock(
[in, out] PNDIS_RW_LOCK Lock,
[in] BOOLEAN fWrite,
[out] PLOCK_STATE LockState
);
Параметры
[in, out] Lock
Указатель на непрозрачную переменную, представляющую блокировку. Вызывающий объект может использовать эту блокировку для доступа к общим ресурсам.
[in] fWrite
Значение типа Boolean. Если значение равно TRUE, этой функции предоставляется доступ на запись к общим ресурсам; Если значение равно FALSE, эта функция предоставляется с доступом на чтение.
[out] LockState
Указатель на непрозрачную переменную, которая отслеживает состояние блокировки. Эта переменная существует в интервале между временем, когда вызывающий объект получает и снимает блокировку. Вызывающий объект должен использовать другую переменную типа LOCK_STATE для каждой попытки получить блокировку из одного потока драйвера, отличного от ISR.
Возвращаемое значение
None
Remarks
Драйвер должен инициализировать переменную типа NDIS_RW_LOCK с помощью Функция NdisInitializeReadWriteLock перед тем, как драйвер вызывает любую другую функцию NdisXxxReadWriteLock. Драйвер должен предоставить резидентные хранилища для блокировок, которые он использует.
После получения блокировки с помощью NdisDprAcquireReadWriteLock вызывающий объект должен освободить ее, вызвав функцию NdisDprReleaseReadWriteLock . Чтобы уменьшать число ссылок блокировки, драйвер должен вызвать
NdisDprReleaseReadWriteLock один раз для каждого вызова NdisDprAcquireReadWriteLock.
Безопасно использовать NdisDprAcquireReadWriteLock и NdisDprAcquireReadWriteLock на одной блокировке. Однако вызовы должны быть сбалансированы, чтобы при получении блокировки с помощью NdisDprAcquireReadWriteLock она должна быть освобождена с помощью NdisDprReleaseReadWriteLock. Аналогичным образом, если блокировка получена с помощью NdisAcquireReadWriteLock, она должна быть освобождена с помощью NdisReleaseReadWriteLock.
В некоторых архитектурах NdisDprAcquireReadWriteLock работает быстрее, чем NdisAcquireReadWriteLock. Драйверы могут использовать NdisDprAcquireReadWriteLock вместо NdisAcquireReadWriteLock , если он уверен, что текущий IRQL уже DISPATCH_LEVEL. Однако это не обязательно. Накладные расходы на вызов функции KeGetCurrentIrql больше, чем преимущество производительности вызова NdisDprAcquireReadWriteLock , а не NdisAcquireReadWriteLock.
Чтобы изменить ресурсы, которые являются общими для потоков драйвера, поток драйвера должен получить блокировку записи. Чтобы просто отслеживать эти ресурсы, поток драйвера должен получить блокировку только для чтения. Для доступа на чтение не требуются заблокированные операции или состязания за блокировку спина. Доступ только для чтения помогает поддерживать хорошую производительность операционной системы и драйвера.
Поток драйвера никогда не должен удерживать блокировку записи более 25 микросекунд. Длительное хранение блокировки записи снижает производительность операционной системы и драйвера.
Драйвер не может использовать блокировку для защиты ресурсов от доступа на чтение или запись, которые его другие функции совместно используют с MiniportInterrupt и (или) Функции MiniportDisableInterruptEx . Вместо этого драйвер должен вызвать NdisMSynchronizeWithInterruptEx , чтобы онФункция MiniportSynchronizeInterrupt обращается к таким общим ресурсам в том же DIRQL, в котором он
MiniportInterrupt и/или Функции MiniportDisableInterruptEx выполняют.
Дополнительные сведения о получении и освобождении спин-блокировок NDIS см. в разделе Синхронизация и уведомление в сетевых драйверах.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Устарело для драйверов NDIS 6.20 и более поздних версий, в которых вместо NdisDprAcquireAcquireRWlockLock Следует использовать NdisAcquireReadWriteLock Или NdisAcquireRWriteLock. Поддерживается в NDIS 6.0 и 6.1. |
Целевая платформа | Универсальное |
Верхняя часть | ndis.h (включая Ndis.h) |
Библиотека | Ndis.lib |
IRQL | = DISPATCH_LEVEL |