Aadapter associated packet queue checkup

Home Forums Discussions General Discussion Aadapter associated packet queue checkup

This topic contains 3 replies, has 2 voices, and was last updated by  Vadim Smirnov 10 years, 1 month ago.

Viewing 4 posts - 1 through 4 (of 4 total)
  • Author
    Posts
  • #5144

    Apple
    Participant

    В документации написано:

    Helper driver will signal this event when adapter associated packet queue is non-empty.

    Интересно, как именно происходит проверка состояния очереди?
    Может есть какой то отдельный поток, который в цикле просматривает состояние очереди, и если она не пуста – сигнализирует в режим юзера?
    Или как то по другому?

    Спасибо.

    #6474

    Vadim Smirnov
    Moderator

    Интересно, как именно происходит проверка состояния очереди?
    Может есть какой то отдельный поток, который в цикле просматривает состояние очереди, и если она не пуста – сигнализирует в режим юзера?

    Когда драйвер перехватывает пакет, он его ставит в очередь и выставляет событие сигнализирующее, что очередь не пуста. User-mode поток ожидающий (WaitForSingleObject/WaitForMultipleObjects) на этом событии пробуждается ото сна и читает пакеты из очереди пока они не закончатся, затем ресетит событие и снова ждет на нем. В общем-то, пример passthru показывает как это делается.

    Альтернатива – polling пакетов без использования событий (пробуем читать пакет, если чтение успешно, то вычитываем все пакеты пока не кончаться, если чтение неуспешно – засыпаем на какое-то время, пример packetsniffer), но на мой взгляд этот метод менее эффективен.

    #6475

    Apple
    Participant

    @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--;
    ..................

    Баг? Или я что-то не понял?

    #6476

    Vadim Smirnov
    Moderator

    Баг? Или я что-то не понял?

    Баг – громко сказано, никаких серьезных негативных последствий тут нет. Однако, с точки зрения производительности, ресетить event лучше после вычитывания пакетов из драйвера.

    ЗЫ Надо будет поправить, чтобы вопросов не возникало…

Viewing 4 posts - 1 through 4 (of 4 total)

You must be logged in to reply to this topic.