1
0
mirror of https://github.com/lxc/incus.git synced 2026-02-05 18:45:46 +01:00
Files
incus/internal/linux/memory.go
Stéphane Graber 09dc3e60bc global: Update Go package to v6
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2024-04-05 11:11:11 -04:00

52 lines
1.1 KiB
Go

package linux
import (
"bufio"
"fmt"
"os"
"strings"
"github.com/lxc/incus/v6/shared/units"
)
// DeviceTotalMemory returns the total amount of memory on the system (in bytes).
func DeviceTotalMemory() (int64, error) {
return GetMeminfo("MemTotal")
}
// GetMeminfo parses /proc/meminfo for the specified field.
func GetMeminfo(field string) (int64, error) {
// Open /proc/meminfo
f, err := os.Open("/proc/meminfo")
if err != nil {
return -1, err
}
defer func() { _ = f.Close() }()
// Read it line by line
scan := bufio.NewScanner(f)
for scan.Scan() {
line := scan.Text()
// We only care about MemTotal
if !strings.HasPrefix(line, field+":") {
continue
}
// Extract the before last (value) and last (unit) fields
fields := strings.Split(line, " ")
value := fields[len(fields)-2] + fields[len(fields)-1]
// Feed the result to units.ParseByteSizeString to get an int value
valueBytes, err := units.ParseByteSizeString(value)
if err != nil {
return -1, err
}
return valueBytes, nil
}
return -1, fmt.Errorf("Couldn't find %s", field)
}