"Легальный" 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)