次の方法で共有


NdisAllocateSpinLock 関数 (ndis.h)

NdisAllocateSpinLock 関数は、ISR 以外のドライバー関数間で共有されているリソースへのアクセスを同期するために使用される、NDIS_SPIN_LOCK型の変数を初期化します。

構文

void NdisAllocateSpinLock(
  [out] PNDIS_SPIN_LOCK SpinLock
);

パラメーター

[out] SpinLock

スピン ロックを表す不透明な変数へのポインター。

戻り値

何一つ

備考

ドライバー NdisAcquireSpinLockndisDprAcquireSpinLock、またはいずれかの NdisInterlockedXxx 関数を呼び出す前に、これらの NdisXxx 関数に必要なパラメーターとして渡されたスピン ロックを初期化するには、NdisAllocateSpinLock 呼び出す必要があります。 呼び出し元は、SpinLock で変数の非ページ ストレージ 提供する必要があります。

NdisAllocateSpinLock 呼び出した後、ドライバーは NdisAcquireSpinLock を呼び出して、スピン ロックによって保護されるリソースの排他的な使用を取得できます。 リソース アクセスが完了すると、ドライバーは NdisReleaseSpinLock 呼び出して、他のドライバー関数がそのスピン ロックによって保護されているリソースにアクセスできるようにします。

一般的なルールとして、パフォーマンスを向上させるには、ドライバーが異なる重要なセクションを保護するために異なるロックを使用する必要があります。 したがって、ドライバーは、NdisAllocateSpinLock 複数のスピン ロックを初期化する可能性があります。

ドライバーが割り当てる各スピン ロックは、IRQL <= DISPATCH_LEVEL で実行されるドライバー関数による同時アクセスから共有リソースの個別のセットを保護します。 たとえば、パケットの内部キューを保持するドライバーは、1 つのスピン ロックを初期化してキューを保護し、別のスピン ロックを初期化して、ミニポートInterrupt を含めず、複数のドライバーが機能する一連の状態変数を保護する場合があります。ミニポートDisableInterruptEx 関数、ドライバーがパケットを処理しているときにアクセスします。

NdisAcquireSpinLock IRQL をDISPATCH_LEVELに発生させ、古い IRQL をスピン ロックに格納します。 スピン ロックを解放すると、IRQL はスピン ロックに格納されている値に設定されます。 NDIS はPASSIVE_LEVELでドライバーを入力する場合があるため、次のコードで問題が発生する可能性があります。

NdisAcquireSpinLock(A);
NdisAcquireSpinLock(B);
NdisReleaseSpinLock(A);
NdisReleaseSpinLock(B);

ドライバーは、次の理由により、このシーケンスのスピン ロックにアクセスしないでください。

  • NdisReleaseSpinLock(A) と NdisReleaseSpinLock(B) の間で、コードはDISPATCH_LEVELではなくPASSIVE_LEVELで実行されており、不適切な中断の影響を受けます。
  • NdisReleaseSpinLock (B) をした後、コードはDISPATCH_LEVELで実行されているため、呼び出し元が後でIRQL_NOT_LESS_OR_EQUAL停止エラーでエラーが発生する可能性があります。
入れ子になったスピン ロックの取得によってデッドロックが頻繁に発生するため、同じ (サブ) セットのリソースを保護するために、ドライバーで 2 つのスピン ロックを使用しないでください。 デッドロックを防ぐためにドライバーを設計できたとしても、入れ子になったスピン ロックの取得はドライバーのパフォーマンスと I/O スループットに悪影響を及ぼします。

ミニポート ドライバーは、スピン ロックを使用して、ISR 以外の関数がその のミニポート インターラップ または共有するリソースを保護することはできません。ミニポートDisableInterruptEx 関数を します。 ミニポートInterrupt またはミニポートDisableInterruptEx 関数 共有されているリソースにアクセスするには、ミニポート ドライバーが呼び出す必要がありますNdisMSynchronizeWithInterruptEx して、 ミニポートSynchronizeInterrupt 関数は、DIRQL でこれらのリソースにアクセスします。

たとえば、NIC が削除され、ドライバーがその NIC に割り当てられているリソースを解放するとき、ドライバーはリソース保護を必要としなくなった場合、ドライバーは NdisFreeSpinLock 呼び出します。

スピン ロックを解放し、スピン ロックを解放すると、混乱を招く可能性があります。 NdisFreeSpinLock は、スピン ロック メモリをクリアして、スピン ロックを表さなくなりました。 取得したスピン ロック NdisReleaseSpinLock で解放すると、別の実行スレッドがそのスピン ロックを取得できます。

NDIS スピン ロックの取得と解放の詳細については、「ネットワーク ドライバー の同期と通知を参照してください。

NdisAllocateSpinLock の呼び出し元は、任意の IRQL で実行できます。 通常、呼び出し元は初期化中に IRQL = PASSIVE_LEVELで実行されます。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista の NDIS 6.0 および NDIS 5.1 ドライバー (NdisAllocateSpinLock (NDIS 5.1) を参照) でサポートされています。 Windows XP で NDIS 5.1 ドライバー (NdisAllocateSpinLock (NDIS 5.1) を参照) でサポートされています。
ターゲット プラットフォーム 万国
ヘッダー ndis.h (Ndis.h を含む)
ライブラリ Ndis.lib
IRQL 任意のレベル (「解説」セクションを参照)
DDI コンプライアンス規則 する SpinLockDpr(ndis), SpinLockDprRelease(ndis), SpinlockRelease(ndis)

関連項目

NDIS プロトコル ドライバーの DriverEntry

ミニポートDisableInterruptEx

ミニポートHaltEx

ミニポートInitializeEx

ミニポートInterrupt

NdisAcquireSpinLock

NdisDprAcquireSpinLock

NdisDprReleaseSpinLock

NdisFreeSpinLock

NdisInterlockedAddUlong

NdisInterlockedInsertHeadList NdisInterlockedInsertTailList NdisInterlockedRemoveHeadList NdisMSynchronizeWithInterruptEx をします。

NdisReleaseSpinLock

NetTimerCallback