mirror of
https://github.com/vlang/v.git
synced 2025-08-03 09:47:15 -04:00
runtime: add used_memory() (#24897)
This commit is contained in:
parent
50db431cfd
commit
220cdda07b
17
vlib/runtime/used_memory_darwin.c.v
Normal file
17
vlib/runtime/used_memory_darwin.c.v
Normal file
@ -0,0 +1,17 @@
|
||||
module runtime
|
||||
|
||||
struct C.task_basic_info {
|
||||
resident_size u64
|
||||
}
|
||||
|
||||
fn C.task_info(C.task_t, int, &C.task_basic_info, &u64) int
|
||||
|
||||
// used_memory retrieves the current physical memory usage of the process.
|
||||
pub fn used_memory() !u64 {
|
||||
mut info := C.task_basic_info{}
|
||||
mut count := u64(C.MACH_TASK_BASIC_INFO_COUNT)
|
||||
if C.task_info(C.mach_task_self(), C.TASK_BASIC_INFO, &info, &count) == C.KERN_SUCCESS {
|
||||
return info.resident_size
|
||||
}
|
||||
return 0
|
||||
}
|
6
vlib/runtime/used_memory_default.c.v
Normal file
6
vlib/runtime/used_memory_default.c.v
Normal file
@ -0,0 +1,6 @@
|
||||
module runtime
|
||||
|
||||
// used_memory retrieves the current physical memory usage of the process.
|
||||
pub fn used_memory() !u64 {
|
||||
return error('`used_memory()` not implemented')
|
||||
}
|
19
vlib/runtime/used_memory_linux.c.v
Normal file
19
vlib/runtime/used_memory_linux.c.v
Normal file
@ -0,0 +1,19 @@
|
||||
module runtime
|
||||
|
||||
import os
|
||||
|
||||
// used_memory retrieves the current physical memory usage of the process.
|
||||
pub fn used_memory() !u64 {
|
||||
file := '/proc/self/status'
|
||||
content := os.read_file(file) or { return 0 }
|
||||
for line in content.split_into_lines() {
|
||||
if line.starts_with('VmRSS:') {
|
||||
parts := line.split(':')
|
||||
if parts.len > 1 {
|
||||
value := parts[1].trim_space().replace('kB', '').trim_space()
|
||||
return value.u64() * 1024 // Convert to bytes
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
21
vlib/runtime/used_memory_test.v
Normal file
21
vlib/runtime/used_memory_test.v
Normal file
@ -0,0 +1,21 @@
|
||||
import runtime
|
||||
|
||||
fn test_used_memory() {
|
||||
used1 := runtime.used_memory()!
|
||||
println('used memory 1 : ${used1}')
|
||||
|
||||
mut mem1 := unsafe { malloc(4096 * 1024) }
|
||||
unsafe { vmemset(mem1, 1, 4096 * 1024) }
|
||||
|
||||
used2 := runtime.used_memory()!
|
||||
println('used memory 2 : ${used2}')
|
||||
|
||||
mut mem2 := unsafe { malloc(8192 * 1024) }
|
||||
unsafe { vmemset(mem2, 1, 8192 * 1024) }
|
||||
|
||||
used3 := runtime.used_memory()!
|
||||
println('used memory 3 : ${used3}')
|
||||
assert used1 > 0
|
||||
assert used2 > used1
|
||||
assert used3 > used2
|
||||
}
|
22
vlib/runtime/used_memory_windows.c.v
Normal file
22
vlib/runtime/used_memory_windows.c.v
Normal file
@ -0,0 +1,22 @@
|
||||
module runtime
|
||||
|
||||
#flag -lpsapi
|
||||
#include <psapi.h>
|
||||
|
||||
@[typedef]
|
||||
struct C.PROCESS_MEMORY_COUNTERS {
|
||||
cb u64
|
||||
WorkingSetSize isize
|
||||
}
|
||||
|
||||
fn C.GetProcessMemoryInfo(int, &C.PROCESS_MEMORY_COUNTERS, u64) bool
|
||||
|
||||
// used_memory retrieves the current physical memory usage of the process.
|
||||
pub fn used_memory() !u64 {
|
||||
mut pmc := C.PROCESS_MEMORY_COUNTERS{}
|
||||
pmc.cb = u64(sizeof(pmc))
|
||||
if C.GetProcessMemoryInfo(C.GetCurrentProcess(), &pmc, pmc.cb) {
|
||||
return u64(pmc.WorkingSetSize)
|
||||
}
|
||||
return 0
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user