Тип 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