11module runtime
22
33#include <mach/mach.h>
4+ #include <mach/task.h>
45
56@[typedef]
67pub struct C.vm_size_t {
@@ -17,21 +18,46 @@ pub struct C.vm_statistics64_data_t {
1718@[typedef]
1819pub struct C.host_t {}
1920
21+ @[typedef]
22+ pub struct C.task_t {}
23+
2024fn C.mach_host_self () C.host_t
25+ fn C.mach_task_self () C.task_t
26+ fn C.mach_port_deallocate (task C.task_t, host C.host_t) int
2127fn C.host_page_size (host C.host_t, out_page_size & C.vm_size_t) int
2228fn C.host_statistics64 (host C.host_t, flavor int , host_info_out & int , host_info_outCnt & u32 ) int
2329
24- fn free_memory_impl () usize {
30+ fn free_memory_impl () ! usize {
2531 $if macos {
2632 mut hs := C.vm_statistics64_ data_t{}
2733 mut vmsz := u32 (C.HOST_VM_INFO64_ COUNT)
2834 mut hps := u32 (0 )
2935 mut host := C.mach_host_self ()
36+ defer {
37+ // Critical: Release send right for host port
38+ // --------------------------------------------------
39+ // Mach ports are system resources. Calling mach_host_self()
40+ // increments the port's reference count. We must manually release
41+ // to prevent resource leaks (port exhaustion can cause kernel failures).
42+ // mach_port_deallocate decrements the reference count, allowing
43+ // system resource reclamation when count reaches zero.
44+ // Parameters:
45+ // C.mach_task_self() - Port for current task
46+ // host - Host port to release
47+ // Return value ignored (_) since we only care about resource cleanup
48+ _ := C.mach_port_deallocate (C.mach_task_self (), host)
49+ }
3050 unsafe {
31- C.host_statistics64 (host, C.HOST_VM_INFO64 , & int (& hs), & vmsz)
32- C.host_page_size (host, & C.vm_size_t (& hps))
51+ retval_1 := C.host_statistics64 (host, C.HOST_VM_INFO64 , & int (& hs), & vmsz)
52+ if retval_1 != C.KERN_SUCCESS {
53+ return error ('free_memory: `C.host_statistics64()` return = ${retval_1} ' )
54+ }
55+ retval_2 := C.host_page_size (host, & C.vm_size_t (& hps))
56+ if retval_2 != C.KERN_SUCCESS {
57+ return error ('free_memory: `C.host_page_size()` return = ${retval_2} ' )
58+ }
3359 }
3460 return usize (u64 (hs.free_count) * u64 (hps))
3561 }
36- return 1
62+ return error ( 'free_memory: not implemented' )
3763}
0 commit comments