summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorapocelipes <[email protected]>2026-07-29 19:04:47 +0800
committerapocelipes <[email protected]>2026-07-29 19:15:15 +0800
commit09764e099ced0b53b2eb1be35beadceab3610dab (patch)
treef043e569fe3ed39b089209d7783637df1422b47a /core/src
parent872c74c9f4dbbc9211951a369f1d77e44403c015 (diff)
fix(macOS): fix Mach host send-right leaks
mach_host_self() increments the task send-right user-reference count, but the CPU and memory queries did not release those references. Reuse each returned host port for its query and deallocate it afterward on both successful and failed query paths.
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/os/cpuinfo.c4
-rw-r--r--core/src/xmake/os/meminfo.c5
2 files changed, 7 insertions, 2 deletions
diff --git a/core/src/xmake/os/cpuinfo.c b/core/src/xmake/os/cpuinfo.c
index 47542a4b4..e931f7912 100644
--- a/core/src/xmake/os/cpuinfo.c
+++ b/core/src/xmake/os/cpuinfo.c
@@ -70,8 +70,9 @@ static tb_float_t xm_os_cpuinfo_usagerate() {
processor_info_array_t cpuinfo;
mach_msg_type_number_t cpuinfo_count;
static tb_hong_t s_time = 0;
+ host_t host = mach_host_self();
if (tb_mclock() - s_time > 1000 &&
- host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &cpu_count, &cpuinfo, &cpuinfo_count) ==
+ host_processor_info(host, PROCESSOR_CPU_LOAD_INFO, &cpu_count, &cpuinfo, &cpuinfo_count) ==
KERN_SUCCESS) {
static processor_info_array_t s_cpuinfo_prev = tb_null;
static mach_msg_type_number_t s_cpuinfo_count_prev = 0;
@@ -100,6 +101,7 @@ static tb_float_t xm_os_cpuinfo_usagerate() {
s_cpuinfo_prev = cpuinfo;
s_cpuinfo_count_prev = cpuinfo_count;
}
+ mach_port_deallocate(mach_task_self(), host);
return cpu_count > 0 ? usagerate / cpu_count : 0;
#elif defined(TB_CONFIG_OS_WINDOWS)
// kernel include idle_time
diff --git a/core/src/xmake/os/meminfo.c b/core/src/xmake/os/meminfo.c
index 96db76f0d..0671d5311 100644
--- a/core/src/xmake/os/meminfo.c
+++ b/core/src/xmake/os/meminfo.c
@@ -61,7 +61,10 @@ static tb_bool_t xm_os_meminfo_stats(tb_int_t *ptotalsize, tb_int_t *pavailsize)
#if defined(TB_CONFIG_OS_MACOSX)
vm_statistics64_data_t vmstat;
mach_msg_type_number_t count = HOST_VM_INFO64_COUNT;
- if (host_statistics64(mach_host_self(), HOST_VM_INFO64, (host_info_t)&vmstat, &count) == KERN_SUCCESS) {
+ host_t host = mach_host_self();
+ kern_return_t result = host_statistics64(host, HOST_VM_INFO64, (host_info_t)&vmstat, &count);
+ mach_port_deallocate(mach_task_self(), host);
+ if (result == KERN_SUCCESS) {
tb_int_t pagesize = (tb_int_t)tb_page_size();
tb_int64_t totalsize = (tb_int64_t)(vmstat.inactive_count + vmstat.free_count + vmstat.active_count +
vmstat.wire_count