トップ回答者
NdisMIndicateReceivePacket はスレッドセーフ?

質問
-
Windowsデバイスドライバ初心者です。よろしくお願いいたします。
Windows XP NDIS用ドライバを作成しています。複数のネットワークデバイスに同時に対応する仕様になっています。デバイス自体がNetwork Switchになっているようなものだとお考えください。
送信側は複数のデバイスにパケットを送出する以外は標準的な動作です。
受信側に関しては、それぞれのデバイスに対して受信用のスレッドが動作します。
そこで、質問です。
受信したパケットはNdisMIndicateReceivePacketにてNDISに渡すようになっているのですが、NdisMIndicateReceivePacketは複数スレッドからの呼び出しに対して安全なのでしょうか? それとも、ドライバ側でロックをかける必要があるのでしょうか? 試してみた限りでは、ロックせずとも動作しているようですが、確信が持てません。少しでも高速に動作させたいのでできればロックしたくはないのですが...
当方DTMのテスト環境は持っていません。
よろしくお願いします。- 移動 Mike Wang (MSCS) 2012年10月2日 11:26 (移動元:Windows デバイスドライバー開発)
回答
-
こんにちは。
MSDNライブラリのNdisMIndicateReceivePacket(http://msdn.microsoft.com/en-us/library/ms804202.aspx)の下のほうに、
以下のような記述があります。
>A miniport driver must release any spin lock that it is holding before calling NdisMIndicateReceivePacket .
「NdisMIndicateReceivePacket を呼び出す前に、ミニポートドライバは取得しているスピンロックを解放しなければなりません。」と
ありますので、ドライバ側でロックをかけてはいけない(=ロックをかける必要がない)ようです。
呼び出し側でロックをかけられないということは、なにもしなくても安全なのではないでしょうか。
私もNIC2枚に対応するNDISドライバ(NDIS5.1/6.0)を開発したことがあります。
その時は、マルチプロセッサのマシン上でNdisMIndicateReceivePacketをロックせずに呼び出しても問題はありませんでした。
(DTMでのテストは行っていませんが・・・)
よろしくお願いします。- 回答としてマーク カウチ 2009年7月7日 3:59
すべての返信
-
こんにちは。
MSDNライブラリのNdisMIndicateReceivePacket(http://msdn.microsoft.com/en-us/library/ms804202.aspx)の下のほうに、
以下のような記述があります。
>A miniport driver must release any spin lock that it is holding before calling NdisMIndicateReceivePacket .
「NdisMIndicateReceivePacket を呼び出す前に、ミニポートドライバは取得しているスピンロックを解放しなければなりません。」と
ありますので、ドライバ側でロックをかけてはいけない(=ロックをかける必要がない)ようです。
呼び出し側でロックをかけられないということは、なにもしなくても安全なのではないでしょうか。
私もNIC2枚に対応するNDISドライバ(NDIS5.1/6.0)を開発したことがあります。
その時は、マルチプロセッサのマシン上でNdisMIndicateReceivePacketをロックせずに呼び出しても問題はありませんでした。
(DTMでのテストは行っていませんが・・・)
よろしくお願いします。- 回答としてマーク カウチ 2009年7月7日 3:59