"Легальный" deadlock при управлении питанием в W2K/XP

From
Leo Yuriev ()
To
All ()
Date
2003-01-22T11:40:35Z
Area
SU.WINDOWS.NT.PROG
From: "Leo Yuriev" <ly@elcat.kg>

Hi All,

На днях отлаживал драйвер, нашел свою ошибку, исправил. Но по-пути пришел к
выводу что в системе управления питанием W2K/XP и т.д. возможен "легальный"
deadlock. 
Возможно что я ошибаюсь, вот собственно поэтому и хочу обсудить... 

1) Имеем два устройства "bus enumerator" - BusFDO и его "child device" -
ChildPDO. Оба устройства без DO_POWER_INRUSH; 
2) Предположим что в некоторый момент времени BusFDO был в PowerDeviceD1, а
ChildPDO в PowerDeviceD2; 
3) Далее юзер начинает использовать ChildPDO, и function-драйвер над ChildPDO
запускает запрос на PowerDeviceD0 для стека ChildPDO; 
4) Предположим, что одновременно с этим истекает интервал IdleDetection для
BusFDO, и "Power Manager" запускает запрос на PowerDeviceD3 для BusFDO (или
еще как-нибудь возникает запрос на PowerDeviceD3); 
5) Далее bus-драйвер для ChildPDO запускает запрос на PowerDeviceD0 для BusFDO
и ждет результата, при этом power-стек ChildPDO остается занятым; 
6) Но и стек BusFDO уже занят запросом PowerDeviceD3, причем драйвер BusFDO
сначала выключит все child-устройства, и только потом продолжит обработку
запроса на PowerDeviceD3; 
7) В итоге получается deadlock между запросами, и его нельзя просто
"развязать" в bus-драйвере, потому что обработка power-запросов должна быть
последовательной хотя и асинхронной, и всегда начинаться с верхушки стека; 

Ну хоть кто-нибуть что-нибудь понял ?

http://leo.yuriev.ru

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)