Из говна и палок
На поведение Windows при вставлении-вынимании флешки я уже жаловался: событие не прилетает, нужно поллить. Потом жаловался и на OS X - событие прилетает, но до того, как устройство появляется в списке томов. Тоже поллинг.
Но действительность на OS X превосходит ожидания.
Если мы размонтируем устройство сами, через FSUnmountVolumeSync(), то поллинг работает нормально: прилетает callback, дальше по таймеру несколько раз читаем список томов, из списка размонтированный том пропадает, все отлично.
А вот если размонтировать через Finder, то жизнь ГОРАЗДО веселее:
- Прилетает callback
- Устройство пропадает из списка
CFURLEnumeratorCreateForMountedVolumes()
- Потом появляется опять
- А потом исчезает окончательно.
- А никакие коллбэки о появлении-исчезании - уже не приходят, просто вот последовательные получения списка томов возвращают разное. Без коллбэков.
- А весь процесс занимает более двух секунд.
Ну понятно, по пропаданию устройства из списка - его надо положить секунд на 5 (пробовал на 2 - см. выше про "более двух секунд") в список изменившихся и все это время сообщения о новом его монтировании - игнорировать.
Хуже другое: если мы в течение этих "двух секунд" хотим перестроить дерево фолдеров, то фолдеры на размонтированном (размонтируемом) устройстве - еще живые. Мы можем их, например, схватить и начать там жить - тогда Finder скажет "не, нихрена не удалось размонтировать" (хотя устройство в начале процесса - никто не держал). То есть вот опять, перестроение дерева нужно отложить, секунд на пять.
В результате, простое и понятное (казалось бы) действие: получи от ОС сигнал о размонтировании диска и поступи правильно - превращается в чудовищное приключение, ибо во время прохождения всех переходных процессов ОС возвращает в процесс ерунду (см. и предыдущий постинг на тему). Казалось бы, ну просто же все, если callback прилетел - список устройств УЖЕ изменился. Если список устройств изменился - пришли callback. Но нет.
Я подозреваю, что Finder размонтирует все каким-нибудь сильно старым путем, доставшимся от OS 9, а этот codepath в текущей X 10.10 не тестировали давно, но тем не менее....