2009-04-02 2 views
3

Я отлаживал сбой в моем коде драйвера HID на Mac и обнаружил, что авария произошла в CFRunLoop. В коде драйвера я открываю USB-ручки для устройств, которые соответствуют VID и PID, которые соответствуют моему HID-устройству, а затем настраивают вызов прерывания для него с помощью функции setInterruptReportHandlerCallback, а затем добавляют его в CFRunLoop с помощью вызова CFRunLoopAddSource. В моем обращении к закрытым ручкам я освободил их, используя CFRunLoopRemoveSource, а затем CFRelease на CFRunLoopSourceRef.Разница между CFRunLoopRemoveSource и CFRunLoopSourceInvalidate

Проблема возникает, когда я пытаюсь открыть ручки, подождите некоторое время (5 мс), а затем закройте ручки в цикле.

Когда я искал проблему, я наткнулся на ссылку, где у них была аналогичная проблема с моим http://lists.apple.com/archives/usb/.../msg00099.html, где они использовали вызов CFRunLoopSourceInvalidate вместо вызова Remove Source. Когда я изменил его на Invalidate source в моем вызове с закрытыми адресами, он исправил мой сбой. Я хотел знать, в чем разница между сбоем и почему этот звонок исправил мой крах?

Благодаря jbsp72

ответ

3

Во-первых, позвольте мне поблагодарить вас. Я печатаю CFRunLoopRemoveSource в google, найдите ваше сообщение, которое является именно той проблемой, которую я пытался решить, и ваше решение, позвонив по телефону CFRunLoopSourceInvalidate, также решает мою проблему.

Теперь разница между CFRunLoopRemoveSource в CFRunLoopSourceInvalidate является:

  • CFRunLoopRemoveSource удаляет источник из определенного цикла выполнения вы укажете.
  • CFRunLoopSourceInvalidate отключает источник и удаляет его со всех запущенных циклов, где был .

Теперь, когда я подозреваю, что авария такая же, как и у меня, это то, что цикл запуска, в который был добавлен источник, исчез, и попытка удалить исходный код из него приводит к сбою. На самом деле, бесконечный цикл в __spin_lock в моем случае.

Теперь, как может исчезнуть цикл запуска? Запуск циклов привязан к потокам. Вы создаете новый поток, у вас есть новый цикл запуска, автоматически. Если поток заканчивается, цикл цикла исчезает вместе с ним. Поток, к которому я привязал цикл выполнения, вышел из системы, а затем удалив исходный код из результатов цикла запуска в результате сбоя.

Причина, по которой аннулирование цикла запуска решает проблему, заключается в том, что она удаляет источник из всех циклов запуска, к которым он был добавлен, игнорируя циклы циклов, которые теперь больше не существуют.

+0

Я только что нашел ту же ошибку в ветке Q7 4.7, в qeventdispatcher_mac.mm. Уч. – asandroq