Понимание CFSet и IOHIDDeviceRegisterRemovalCallback в IOKit - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь понять фрагмент кода в пространстве пользователя IOKit, написанный на C с использованием CFSet, CFAllocator и других не-NS * / Swift конструкций.

https://opensource.apple.com/source/IOKitUser/IOKitUser-1445.40.1/hid.subproj/IOHIDDevice.c.auto.html

https://developer.apple.com/library/archive/technotes/tn2187/_index.html

Давайте возьмем IOHIDDeviceRegisterRemovalCallback() и __IOHIDDeviceNotification() в качестве примера (то же самое относится и к аналогичным функциям, таким как IOHIDDeviceRegisterInputValueCallback и __IOHIDDeviceRegisterInputReportCallback.

IOHIDDeviceRegisterRemovalCallback (), по-видимому, регистрирует обратный вызов таким образом, что он сможет обрабатывать несколько обратных вызовов одновременно. Это происходит потому, что он добавляет infoRef в CFSet с именем removalCallbackSet. Затем __IOHIDDeviceNotification, который, по-видимому, является единственнымобратный вызов зарегистрирован для уровня ниже этого кода пользовательского пространства, он вызывается один раз, а затем циклически удаляется с помощью RemovalCallbackSet и запускает каждый из нескольких зарегистрированных обратных вызовов.

Однако в моей второй ссылке в документации упоминается, что вЧтобы «отменить регистрацию» обратного вызова, вы передаете нулевой / ноль функции регистрации. Это не имеет никакого смысла. infoRef теперь является экземпляром{callback = nil, context = nil} и удаляет это значение из CFSet.Но это значение никогда не было бы в наборе во-первых, потому что элементы набора были бы в форме {callback =, context =}.

1) Я что-то пропустил, или это вызов CFSetRemoveValueфактически бесполезен, и вы не можете фактически удалить обратные вызовы из IOHIDDeviceRef?

2) Правильно ли я считаю, что CFSet сравнивает значение infoRef в переменных обратного вызова и контекста, а не указатель на infoRefсам по себе?

3) Я что-то упустил из-за того, как работает CFAllocator?

4) Использует ли CFSet только значение context, и, таким образом, вы отменяете регистрацию, передавая тот же контекстно ноль обратного вызова?

1 Ответ

0 голосов
/ 29 сентября 2018

"Номер 4 правильный.

__ IOHIDDeviceCallbackBaseDataIsEqual - это то, как элементы в наборе сравниваются друг с другом. Он только проверяет контекст.

result = info1-> context == info2-> context; "

https://www.reddit.com/r/iOSProgramming/comments/9jkaye/understanding_lowerlevel_cfset_and_an_iokit/e6sigfw/

...