Сохраните количества Объектов io_object_t в IOKit.framework
Q: Я думаю, что просачиваюсь io_object_t объекты в моем пространстве пользователя код Набора I/O. Я использовал функцию IOObjectGetRetainCount для нахождения сохранить количества тех объектов но значений, я возвращаюсь, больше, чем я ожидал. Почему это?
A: Я думаю, что просачиваюсь io_object_t объекты в моем пространстве пользователя код Набора I/O. Я использовал функцию IOObjectGetRetainCount для нахождения сохранить количества тех объектов но значений, я возвращаюсь, больше, чем я ожидал. Почему это?
Существует фактически два отдельных, сохраняют количества, включенные здесь. Первым является сохранить количество базового объекта ядра, представленного io_object_t. Функция IOObjectGetRetainCount возвраты это сохраняет количество путем вызова через к ядру.
Вторым является сохранить количество io_object_t самостоятельно. io_object_t обертка вокруг порта Маха, используемого для передачи между пространством пользователя и ядром, и порты Маха имеют свое собственное, сохраняют количество. Это также применяется к другим типам, полученным из io_object_t: io_service_t, io_connect_t, io_iterator_t, io_registry_entry_t, и io_enumerator_t. (Эти типы определяются в IOKit/IOTypes.h.)
IOObjectRetain и IOObjectRelease воздействуйте на сохранить количество io_object_t Сам порт Маха. Это может быть проверено путем взгляда на IOKitLib.c в проекте IOKitUser в Дарвине.
Так, корректный способ получить сохранить количество io_object_t должен использовать функцию Маха mach_port_get_refs как показано в отрывке в Перечислении 1.
Перечисление 1 , Получающее сохранить количество io_object_t.
#include <IOKit/IOKitLib.h>
#include <mach/mach_port.h>
kern_return_t kr;
unsigned int result;
io_object_t theObject;
io_name_t className;
kr = IOObjectGetClass(theObject, className);
if (KERN_SUCCESS == kr) {
kern_return_t kr2;
kr2 = mach_port_get_refs(mach_task_self(),
theObject,
MACH_PORT_RIGHT_SEND,
&result);
printf("io_object_t: 0x%08x, Class: %s, Retain Count: %d, Result=0x%08x\n",
theObject, className, result, kr2);
} |
Если Вы получаете известный 0x10000003 (MACH_SEND_INVALID_DEST) код возврата назад от функции IOKit.framework, это относится к устаревшему io_object_t, не базовый объект ядра. Для получения дополнительной информации о кодах ошибки Набора I/O, см. Понимая коды ошибки IOKit.
История версии документа
| Дата | Примечания |
|---|---|
| 24.09.2008 | Незначительные редакционные изменения. |
| 04.09.2002 | Новый документ, различающий сохранить количества объекта ядра Набора I/O и его io_object_t прокси пространства пользователя. |