2026-05-20 14:14:24 -04:00
|
|
|
extends RefCounted
|
|
|
|
|
class_name MemoryCollector
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func collect() -> float:
|
|
|
|
|
var meminfo := _read_meminfo()
|
|
|
|
|
if meminfo.is_empty():
|
|
|
|
|
return 0.0
|
|
|
|
|
|
2026-05-20 14:30:45 -04:00
|
|
|
var total: int = meminfo.get("MemTotal", 0)
|
|
|
|
|
var available: int = meminfo.get("MemAvailable", 0)
|
2026-05-20 14:14:24 -04:00
|
|
|
|
|
|
|
|
if total == 0:
|
|
|
|
|
return 0.0
|
|
|
|
|
|
|
|
|
|
return 100.0 * (1.0 - float(available) / float(total))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _read_meminfo() -> Dictionary:
|
|
|
|
|
var file := FileAccess.open("/proc/meminfo", FileAccess.READ)
|
|
|
|
|
if file == null:
|
|
|
|
|
return {}
|
|
|
|
|
|
|
|
|
|
var result: Dictionary = {}
|
|
|
|
|
while not file.eof_reached():
|
|
|
|
|
var line: String = file.get_line().strip_edges()
|
|
|
|
|
if line.is_empty():
|
|
|
|
|
continue
|
|
|
|
|
var parts := line.split(":", false)
|
|
|
|
|
if parts.size() < 2:
|
|
|
|
|
continue
|
|
|
|
|
var key := parts[0].strip_edges()
|
|
|
|
|
var val_str := parts[1].strip_edges().split(" ", false)[0]
|
|
|
|
|
result[key] = val_str.to_int()
|
|
|
|
|
|
|
|
|
|
return result
|