memtotal.go 917 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package sysinfo
  2. import (
  3. "bufio"
  4. "errors"
  5. "io"
  6. "regexp"
  7. "strconv"
  8. )
  9. // BytesToMebibytes converts bytes into mebibytes.
  10. func BytesToMebibytes(bts uint64) uint64 {
  11. return bts / ((uint64)(1024 * 1024))
  12. }
  13. var (
  14. meminfoRe = regexp.MustCompile(`^MemTotal:\s+([0-9]+)\s+[kK]B$`)
  15. errMemTotalNotFound = errors.New("supported MemTotal not found in /proc/meminfo")
  16. )
  17. // parseProcMeminfo is used to parse Linux's "/proc/meminfo". It is located
  18. // here so that the relevant cross agent tests will be run on all platforms.
  19. func parseProcMeminfo(f io.Reader) (uint64, error) {
  20. scanner := bufio.NewScanner(f)
  21. for scanner.Scan() {
  22. if m := meminfoRe.FindSubmatch(scanner.Bytes()); m != nil {
  23. kb, err := strconv.ParseUint(string(m[1]), 10, 64)
  24. if err != nil {
  25. return 0, err
  26. }
  27. return kb * 1024, nil
  28. }
  29. }
  30. err := scanner.Err()
  31. if err == nil {
  32. err = errMemTotalNotFound
  33. }
  34. return 0, err
  35. }