Aadapter associated packet queue checkup

Home Forums Discussions General Aadapter associated packet queue checkup

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
      Keymaster

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

        Когда драйвер перехватывает пакет, он его ставит в очередь и выставляет событие сигнализирующее, что очередь не пуста. 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
          Keymaster

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

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

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

          Viewing 4 posts - 1 through 4 (of 4 total)
          • You must be logged in to reply to this topic.