Home › Forums › Discussions › General › Aadapter associated packet queue checkup
- This topic has 3 replies, 2 voices, and was last updated 17 years, 1 month ago by Vadim Smirnov.
-
AuthorPosts
-
October 31, 2007 at 8:54 pm #5144
В документации написано:
Helper driver will signal this event when adapter associated packet queue is non-empty.
Интересно, как именно происходит проверка состояния очереди?
Может есть какой то отдельный поток, который в цикле просматривает состояние очереди, и если она не пуста – сигнализирует в режим юзера?
Или как то по другому?Спасибо.
November 1, 2007 at 12:13 am #6474Интересно, как именно происходит проверка состояния очереди?
Может есть какой то отдельный поток, который в цикле просматривает состояние очереди, и если она не пуста – сигнализирует в режим юзера?Когда драйвер перехватывает пакет, он его ставит в очередь и выставляет событие сигнализирующее, что очередь не пуста. User-mode поток ожидающий (WaitForSingleObject/WaitForMultipleObjects) на этом событии пробуждается ото сна и читает пакеты из очереди пока они не закончатся, затем ресетит событие и снова ждет на нем. В общем-то, пример passthru показывает как это делается.
Альтернатива – polling пакетов без использования событий (пробуем читать пакет, если чтение успешно, то вычитываем все пакеты пока не кончаться, если чтение неуспешно – засыпаем на какое-то время, пример packetsniffer), но на мой взгляд этот метод менее эффективен.
November 1, 2007 at 7:29 pm #6475@SerpentFly wrote:
Когда драйвер перехватывает пакет, он его ставит в очередь и выставляет событие сигнализирующее, что очередь не пуста. User-mode поток ожидающий (WaitForSingleObject/WaitForMultipleObjects) на этом событии пробуждается ото сна и читает пакеты из очереди пока они не закончатся, затем ресетит событие и снова ждет на нем. В общем-то, пример passthru показывает как это делается.
Альтернатива – polling пакетов без использования событий (пробуем читать пакет, если чтение успешно, то вычитываем все пакеты пока не кончаться, если чтение неуспешно – засыпаем на какое-то время, пример packetsniffer), но на мой взгляд этот метод менее эффективен.
А почему же в примере passthru – эвент резетится сразу же после WaitForSingleObject? Вот кусок кода примера passthru
...............
while (counter != 0)
{
WaitForSingleObject ( hEvent, INFINITE );
ResetEvent(hEvent);
while(api.ReadPacket(&Request))
{
counter--;
..................
Баг? Или я что-то не понял?
November 1, 2007 at 9:11 pm #6476Баг? Или я что-то не понял?
Баг – громко сказано, никаких серьезных негативных последствий тут нет. Однако, с точки зрения производительности, ресетить event лучше после вычитывания пакетов из драйвера.
ЗЫ Надо будет поправить, чтобы вопросов не возникало…
-
AuthorPosts
- You must be logged in to reply to this topic.