Технические вопросы и ответы QA1195

Сохраните количества Объектов 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 прокси пространства пользователя.