Я пытаюсь понять фрагмент кода в пространстве пользователя 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
, и, таким образом, вы отменяете регистрацию, передавая тот же контекстно ноль обратного вызова?