NdisAcquireSpinLock

VOID
    NdisAcquireSpinLock(

        IN PNDIS_SPIN_LOCK  SpinLock
        );

NdisAcquireSpinLock acquires a spin lock so the caller gains exclusive access to the resources, shared among driver functions, that the spin lock protects.

Parameters

SpinLock
Points to an opaque spin lock, already initialized by the caller.

Comments

The driver must initialize a variable of type NDIS_SPIN_LOCK with NdisAllocateSpinLock before it calls any other Ndis..SpinLock function. The driver must provide resident storage for the spin lock(s) it uses.

After acquiring a spin lock with NdisAcquireSpinLock, the caller must release that lock with a call to NdisReleaseSpinLock. A driver must call NdisReleaseSpinLock following each call to NdisAcquireSpinLock. Otherwise, a deadlock occurs, hanging the driver.

A spin lock acquired with NdisAcquireSpinLock must be released with NdisReleaseSpinLock. A spin lock acquired with NdisDprAcquireSpinLock must be released with NdisDprReleaseSpinLock.

A driver should never hold a spin lock for an extended period (more than a few instructions). Holding a spin lock for longer than 25 microseconds degrades both system and driver performance.

A miniport driver cannot use a spin lock to protect resources that its other functions share with the MiniportISR and/or MiniportDisableInterrupt functions. Instead, a miniport must call NdisMSynchronizeWithInterrupt so that its MiniportSynchronizeISR function accesses such shared resources at the same DIRQL at which its MiniportISR and/or MiniportDisableInterrupt functions do.

Callers of NdisAcquireSpinLock run at IRQL <= DISPATCH_LEVEL.

See Also

MiniportDisableInterrupt, MiniportHalt, MiniportInitialize, MiniportISR, MiniportSynchronizeISR, NdisAllocateSpinLock, NdisDprAcquireSpinLock, NdisMSynchronizeWithInterrupt, NdisReleaseSpinLock