github.com/Cloud-Foundations/Dominator@v0.3.4/lib/meminfo/getMemInfo_linux.go (about)

     1  package meminfo
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"os"
     7  	"strings"
     8  )
     9  
    10  var procMeminfo string = "/proc/meminfo"
    11  
    12  func getMemInfo() (*MemInfo, error) {
    13  	file, err := os.Open(procMeminfo)
    14  	if err != nil {
    15  		return nil, err
    16  	}
    17  	defer file.Close()
    18  	scanner := bufio.NewScanner(file)
    19  	memInfo := new(MemInfo)
    20  	for scanner.Scan() {
    21  		if err := memInfo.processMeminfoLine(scanner.Text()); err != nil {
    22  			return nil, err
    23  		}
    24  	}
    25  	if err := scanner.Err(); err != nil {
    26  		return nil, err
    27  	}
    28  	return memInfo, nil
    29  }
    30  
    31  func (m *MemInfo) processMeminfoLine(line string) error {
    32  	splitLine := strings.SplitN(line, ":", 2)
    33  	if len(splitLine) != 2 {
    34  		return nil
    35  	}
    36  	meminfoName := splitLine[0]
    37  	meminfoDataString := strings.TrimSpace(splitLine[1])
    38  	var ptr *uint64
    39  	switch meminfoName {
    40  	case "MemAvailable":
    41  		m.HaveAvailable = true
    42  		ptr = &m.Available
    43  	case "MemFree":
    44  		ptr = &m.Free
    45  	case "MemTotal":
    46  		ptr = &m.Total
    47  	default:
    48  		return nil
    49  	}
    50  	var meminfoData uint64
    51  	var meminfoUnit string
    52  	fmt.Sscanf(meminfoDataString, "%d %s", &meminfoData, &meminfoUnit)
    53  	if meminfoUnit != "kB" {
    54  		return fmt.Errorf("unknown unit: %s for: %s", meminfoUnit, meminfoName)
    55  	}
    56  	*ptr = meminfoData * 1024
    57  	return nil
    58  }