Синхронизация
NDIS предоставляет механизм спин-блокировок, который
может быть использован, чтобы синхронизировать доступ к общим ресурсам
между потоками, имеющими одинаковый приоритет. Если два потока исполняются
с различными приоритетами, то NDIS обеспечивает механизм временного повышения
приоритета потока с более низким приоритетом. Любая функция драйвера,
разделяющая ресурсы с процедурой ISR этого же драйвера, должна иметь возможность
повышения своего IRQL до DIRQL, этот механизм обеспечивается NDIS.
Также NDIS предоставляет механизм извещения, необходимый в том случае,
если исполнение потока зависит от появления события вне этого потока.
Например, драйвер может нуждаться в механизме предупреждения об истечении
какого-то периода времени, чтобы он мог проверить свои устройства. Или
драйвер сетевой карты может выполнять периодический опрос сетевой карты.
Этот механизм обеспечивают таймеры.
Спин-блокировка (Spin Lock). Поток должен
сначала захватить спин-блокировку, прежде чем пытаться получить доступ
к защищаемым ресурсам. Спин-блокировка удерживает все потоки, кроме одного
потока-владельца спин-блокировкой, от использования ресурсов. Другие потоки
ждут освобождения спин-блокировки. Сетевые драйверы должны минимизировать время захвата спин-блокировки.
Функции для работы со спин-блокировками:
VOID NdisAllocateSpinLock (IN PNDIS_SPIN_LOCK SpinLock);
VOID NdisAcquireSpinLpck (IN PNDIS_SPIN_LOCK SpinLock);
VOID NdisReleaseSpinLock (IN PNDIS_SPIN_LOCK SpinLock);
VOID NdisFreeSpinLock (IN PNDIS_SPIN_LOCK SpinLock);
Таймер. Драйвер создает
таймер и ассоциирует с ним функцию, которая вызывается, когда истекает
определенный период времени. Таймер может быть одноразовым (сработать
один раз) или периодическим. Периодические таймеры срабатывают до тех
пор, пока не будут сброшены.
Таймеры создаются и инициализируются путем вызова функции NdisMInitialize
Timer, и устанавливаются с помощью вызова NdisMSetTimer, или (если это
периодический таймер) с помощью вызова функции NdisMSetPeriodic Timer.
Функция NdisMCancelTimer сбрасывает таймер.
События (Events). События обеспечивают механизм
синхронизации исполнения потоков. Один поток инициализирует событие с
помощью вызова NdisInitializeEvent. Другой поток (или тот же самый), исполняемый
с приоритетом PASSIVE_LEVEL, может вызвать функцию NdisWaitEvent, чтобы
усыпиться до момента возникновения события, либо до истечения определенного
им промежутка времени (что произойдет быстрее). Событие устанавливается
и сбрасывается с помощью функций NdisSetEvent и NdisResetEvent соответственно.