host_processor_sets возвращает KERN_INVALID_ARGUMENT

Я запускаю приведенный ниже код в Xcode, а также выбрал root в схеме запуска для приведенного ниже кода.

fileprivate static let machHost = mach_host_self()
var psets: processor_set_name_array_t? = nil
var pcnt: mach_msg_type_number_t = 0
withUnsafeMutablePointer(to: &psets) { psetptr in
    var result = host_processor_sets(machHost, psetptr, &pcnt)
}

Однако переменная result всегда возвращает 4 (KERN_INVALID_ARGUMENT), а я ожидал 0 (KERN_SUCCESS).


person Ramkumar Srinivasan    schedule 06.07.2021    source источник
comment
Проверьте это: stackoverflow.com/a/40598162/1187415   -  person Martin R    schedule 06.07.2021


Ответы (1)


Тип processor_set_name_array_t определяется следующим образом:

public typealias processor_set_name_array_t = UnsafeMutablePointer<processor_set_t>

Так что это уже тип указателя. host_processor_sets ожидает указатель на пространство, выделенное для хранения последовательной последовательности processor_set_t элементов.

Однако, когда вы делаете

withUnsafeMutablePointer(to: &psets) { psetptr in
    var result = host_processor_sets(machHost, psetptr, &pcnt)
}

psetptr — это UnsafeMutablePointer<UnsafeMutablePointer< processor_set_t>>, то есть это указатель на указатель, указывающий на элементы processor_set_t. Если вы знакомы с C, вы передаете processor_set_t** функции, ожидающей processor_set_t*.

Предполагая, что передача nil в порядке - обычно это делается для того, чтобы просто получить количество элементов для выделения места, но документации немного не хватает - тогда вам нужно следующее:

fileprivate static let machHost = mach_host_self()
var pcnt: mach_msg_type_number_t = 0
var result = host_processor_sets(machHost, nil, &pcnt)

Если у вас есть pcnt, если вы хотите получить сами элементы processor_set_t, вы сможете сделать это следующим образом:

var psets = [processor_set_t](repeating: .init(), count: Int(pcnt));
result = psets.withUnsafeMutableBufferPointer {
    host_processor_sets(machHost, $0.baseAddress, &pcnt)
}
person Chip Jarred    schedule 07.07.2021