|
1 | 1 | use std::num::NonZeroUsize; |
| 2 | +use std::{mem, ptr}; |
2 | 3 |
|
3 | 4 | use mach2::kern_return::KERN_SUCCESS; |
| 5 | +use mach2::mach_types::thread_act_array_t; |
| 6 | +use mach2::message::mach_msg_type_number_t; |
| 7 | +use mach2::port::mach_port_t; |
4 | 8 | use mach2::task::task_threads; |
5 | 9 | use mach2::traps::mach_task_self; |
| 10 | +use mach2::vm::mach_vm_deallocate; |
| 11 | +use mach2::vm_types::{mach_vm_address_t, mach_vm_size_t}; |
6 | 12 |
|
7 | 13 | pub(crate) fn thread_amount() -> Option<NonZeroUsize> { |
8 | | - let mut state = [0u32; 1296]; |
9 | | - let mut count: u32 = 0; |
10 | | - let rc = unsafe { |
11 | | - task_threads( |
12 | | - mach_task_self(), |
13 | | - &mut state.as_mut_ptr() as *mut *mut u32, |
14 | | - &mut count as *mut _, |
15 | | - ) |
16 | | - }; |
| 14 | + unsafe { |
| 15 | + let task = mach_task_self(); |
| 16 | + let mut thread_list: thread_act_array_t = ptr::null_mut(); |
| 17 | + let mut count: mach_msg_type_number_t = 0; |
| 18 | + let rc = task_threads(task, &mut thread_list, &mut count); |
17 | 19 |
|
18 | | - if rc == KERN_SUCCESS { |
19 | | - NonZeroUsize::new(usize::try_from(count).expect("Failed converting from u32 to usize")) |
20 | | - } else { |
21 | | - None |
| 20 | + if rc != KERN_SUCCESS { |
| 21 | + return None; |
| 22 | + } |
| 23 | + |
| 24 | + let result = NonZeroUsize::new(count as usize); |
| 25 | + let size = (count as usize * mem::size_of::<mach_port_t>()) as mach_vm_size_t; |
| 26 | + let _ = mach_vm_deallocate(task, thread_list as mach_vm_address_t, size); |
| 27 | + |
| 28 | + result |
22 | 29 | } |
23 | 30 | } |
24 | 31 |
|
|
0 commit comments