Из говна и палок

На поведение Windows при вставлении-вынимании флешки я уже жаловался: событие не прилетает, нужно поллить. Потом жаловался и на OS X - событие прилетает, но до того, как устройство появляется в списке томов. Тоже поллинг.

Но действительность на OS X превосходит ожидания.

Если мы размонтируем устройство сами, через FSUnmountVolumeSync(), то поллинг работает нормально: прилетает callback, дальше по таймеру несколько раз читаем список томов, из списка размонтированный том пропадает, все отлично.

А вот если размонтировать через Finder, то жизнь ГОРАЗДО веселее:

  • Прилетает callback
  • Устройство пропадает из списка CFURLEnumeratorCreateForMountedVolumes()
  • Потом появляется опять
  • А потом исчезает окончательно.
  • А никакие коллбэки о появлении-исчезании - уже не приходят, просто вот последовательные получения списка томов возвращают разное. Без коллбэков.
  • А весь процесс занимает более двух секунд.

Ну понятно, по пропаданию устройства из списка - его надо положить секунд на 5 (пробовал на 2 - см. выше про "более двух секунд") в список изменившихся и все это время сообщения о новом его монтировании - игнорировать.

Хуже другое: если мы в течение этих "двух секунд" хотим перестроить дерево фолдеров, то фолдеры на размонтированном (размонтируемом) устройстве - еще живые. Мы можем их, например, схватить и начать там жить - тогда Finder скажет "не, нихрена не удалось размонтировать" (хотя устройство в начале процесса - никто не держал). То есть вот опять, перестроение дерева нужно отложить, секунд на пять.

В результате, простое и понятное (казалось бы) действие: получи от ОС сигнал о размонтировании диска и поступи правильно - превращается в чудовищное приключение, ибо во время прохождения всех переходных процессов ОС возвращает в процесс ерунду (см. и предыдущий постинг на тему). Казалось бы, ну просто же все, если callback прилетел - список устройств УЖЕ изменился. Если список устройств изменился - пришли callback. Но нет.

Я подозреваю, что Finder размонтирует все каким-нибудь сильно старым путем, доставшимся от OS 9, а этот codepath в текущей X 10.10 не тестировали давно, но тем не менее....