Skip to content

Commit 28860d4

Browse files
authored
fix: memory leak on windows, macos, and ios (#29)
* fix(windows, osx): memory leak * chore: cargo fmt * fix: import `mach_port_t` from `mach2::port` * fix: import `std::mem` * fix: import `vm_address_t`, `vm_size_t` from `mach2::vm_types` * fix: types
1 parent 0c9709e commit 28860d4

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

src/osx.rs

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
11
use std::num::NonZeroUsize;
2+
use std::{mem, ptr};
23

34
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;
48
use mach2::task::task_threads;
59
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};
612

713
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);
1719

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
2229
}
2330
}
2431

src/windows.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::num::NonZeroUsize;
22
use std::{mem, process, ptr};
33

44
use field_offset::offset_of;
5+
use windows::Win32::Foundation::CloseHandle;
56
use windows::Win32::System::Diagnostics::ToolHelp::{
67
CreateToolhelp32Snapshot,
78
Thread32First,
@@ -39,6 +40,8 @@ pub(crate) fn thread_amount() -> Option<NonZeroUsize> {
3940
}
4041
}
4142
}
43+
44+
CloseHandle(handle).expect("Failed closing handle");
4245
}
4346

4447
NonZeroUsize::new(amount)

0 commit comments

Comments
 (0)