Всем доброго времени суток!
Во время прочтения Linux Device Drivers (глава 6, «засыпания» при блокирующем вводе выводе) возникло небольшое непонимание.
Приведен код, целью которого является помещение процесса в состояние сна до наступления определенного события (невыполнение условия сна):
while (spacefree(dev) == 0)
{
...
prepare_to_wait(&dev->outq, &wait, TASK_INTERRUPTIBLE);
if (spacefree(dev) == 0)
schedule( );
finish_wait(&dev->outq, &wait);
...
}
Аналогичный код был найден в исходниках ядра (например, inet_connection_sock.c:inet_csk_wait_for_connect()).
Но у меня возникает подозрение, что данный код не будет работать правильно в ядрах с вытеснением.
Допустим, работа произошла по следующему сценарию:
При входе в цикл условие истино - цикл начинается. После этого в другом потоке выколнения условие изменяется, пробуждаются все процессы, находящиеся в очереди outq (нашего там еще нет). Затем первый поток выполняет метод prepare_to_wait - процесс помещается в очередь, а его состояние - TASK_INTERRUPTIBLE, но процесс все еще на процессоре и, по идее, проверив условие засыпания должен пропустить вызов shedule и перейти в состояние TASK_RUNNING в методе finish_wait. Однако, до вызова finish_wait он может быть вытеснен другим процессом или прерыванием и отправиться в спячку непредсказуемой длительности при ложном значении условиия сна.
Подскажите, правильно ли я понимаю эту ситуацию, и если нет, то куда копать для ее понимания.
Спасибо.