Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проверка DeviceQueue на пустоту.  (Прочитано 7756 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Anonymous
Гость
« : 11-02-2004 14:30 » new

Добрый вечер..

Есть пара вопросов про DeviceQueue
 :?:  Как определить пустая ли очередь.
 :?:  Из-за чега возможн НЕУСПЕХ при добавлении элемента в очередь

This call to KeInsertDeviceQueue might add the IRP to the queue, in which case the return value will be TRUE and we won't do anything more with the IRP. If the device is currently idle, however, the return value will be FALSE and the IRP will not have been placed on the queue. We therefore call StartIoSpecial directly.

Что значит  девайс каренли идл? Какой такой девайс? Я этого не понимяю....Я решил что мне не нужно делать отдельных стартио (их можно перенести и на DPC)

Заранее спасибо
Записан
Anonymous
Гость
« Ответ #1 : 11-02-2004 14:32 » 

Если можно приведите пож конкретный пример, когда в очередь не удастся добавить элемент...
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 11-02-2004 15:35 » 

Цитата

Как определить пустая ли очередь.
........
Что значит девайс каренли идл


Может Майкрософт так и не рекомендует(типа структуры могут изменится)

KeAcquireSpinLockAtDpcLevel(&DeviceQueue->Lock);
if(DeviceQueue->Busy!=FALSE)
{
  busy;
doing smth.
}
else
{
not busy;
doing smth.
}
KeReleaseSpinLockFromDpcLevel(&DeviceQueue->Lock);

Цитата

Из-за чега возможн НЕУСПЕХ при добавлении элемента в очередь


Если DeviceQueue->Busy == FALSE.

А вобще то я их не использую, пользуюсь своими очередями- LIST_ENTRY посмотри и макросы с ним связанные.
Записан
Anonymous
Гость
« Ответ #3 : 12-02-2004 16:38 » 

спасибо.
Записан
Anonymous
Гость
« Ответ #4 : 15-02-2004 09:52 » 

А как мне синхронизировать доступ к очереди LIST_ENTRY?
на PASSIVE_LEVEL я добавляю элемент очереди, а на DISPATCH должен забирать.

Посмотрел как люди делают - делают синхро спинлок. На PASSIVE захватывают, добавляют элемент и отпускают. На DISPATCH захватывают спинлок забирают элемент из очереди и отпускают.

Но как же это работает?? Ведь возможна ситуация, когда мы на PASSIVE захватываем спинлок, начинаем добавлять элемент, приходит, например, прерывание, PASSIVE поток останавливается начинает работать Isr, затем IsrDpc, в котором мы снова пытаемся захватить спинлок...и все...все должно повиснуть!
Записан
Anonymous
Гость
« Ответ #5 : 15-02-2004 09:56 » 

Я идиот! забыл что до захвата спинлока на пэссив irql переключается на диспетч затем захватывается...

Извиняюсь за глупый вопрос.
Записан
Anonymous
Гость
« Ответ #6 : 15-02-2004 10:02 » 

Кстати на не SMP для синхронизиции достаточно и одного райса irql. Снинлоки для синхоризации DPC очередей каждого процессора....
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines