summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Gamsjager <matthias.gamsjager@philips.com>2019-05-28 11:43:29 -0700
committerCaleb Bassi <calebjbassi@gmail.com>2019-05-28 11:48:04 -0700
commit45b5b2dbc0c2fcb6d4973bb9d13a28e23f2d1419 (patch)
tree8101f272d9a39a6f30160653766ec4f1449405f5
parent6907f598f8374d4691579943c48bec01de274401 (diff)
Fix issues with swap memory on FreeBSD
-rw-r--r--src/widgets/mem.go72
-rw-r--r--src/widgets/mem_freebsd.go61
-rw-r--r--src/widgets/mem_other.go22
3 files changed, 119 insertions, 36 deletions
diff --git a/src/widgets/mem.go b/src/widgets/mem.go
index 03da0d7..2b5074c 100644
--- a/src/widgets/mem.go
+++ b/src/widgets/mem.go
@@ -16,6 +16,38 @@ type MemWidget struct {
updateInterval time.Duration
}
+type MemoryInfo struct {
+ Total uint64
+ Used uint64
+ UsedPercent float64
+}
+
+func (self *MemWidget) renderMemInfo(line string, memoryInfo MemoryInfo) {
+ self.Data[line] = append(self.Data[line], memoryInfo.UsedPercent)
+ memoryTotalBytes, memoryTotalMagnitude := utils.ConvertBytes(memoryInfo.Total)
+ memoryUsedBytes, memoryUsedMagnitude := utils.ConvertBytes(memoryInfo.Used)
+ self.Labels[line] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
+ memoryInfo.UsedPercent,
+ memoryUsedBytes,
+ memoryUsedMagnitude,
+ memoryTotalBytes,
+ memoryTotalMagnitude,
+ )
+}
+
+func (self *MemWidget) updateMainMemory() {
+ mainMemory, err := psMem.VirtualMemory()
+ if err != nil {
+ log.Printf("failed to get main memory info from gopsutil: %v", err)
+ } else {
+ self.renderMemInfo("Main", MemoryInfo{
+ Total: mainMemory.Total,
+ Used: mainMemory.Used,
+ UsedPercent: mainMemory.UsedPercent,
+ })
+ }
+}
+
func NewMemWidget(updateInterval time.Duration, horizontalScale int) *MemWidget {
self := &MemWidget{
LineGraph: ui.NewLineGraph(),
@@ -26,49 +58,17 @@ func NewMemWidget(updateInterval time.Duration, horizontalScale int) *MemWidget
self.Data["Main"] = []float64{0}
self.Data["Swap"] = []float64{0}
- self.update()
+ self.updateMainMemory()
+ self.updateSwapMemory()
go func() {
for range time.NewTicker(self.updateInterval).C {
self.Lock()
- self.update()
+ self.updateMainMemory()
+ self.updateSwapMemory()
self.Unlock()
}
}()
return self
}
-
-func (self *MemWidget) update() {
- mainMemory, err := psMem.VirtualMemory()
- if err != nil {
- log.Printf("failed to get main memory info from gopsutil: %v", err)
- } else {
- self.Data["Main"] = append(self.Data["Main"], mainMemory.UsedPercent)
- mainMemoryTotalBytes, mainMemoryTotalMagnitude := utils.ConvertBytes(mainMemory.Total)
- mainMemoryUsedBytes, mainMemoryUsedMagnitude := utils.ConvertBytes(mainMemory.Used)
- self.Labels["Main"] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
- mainMemory.UsedPercent,
- mainMemoryUsedBytes,
- mainMemoryUsedMagnitude,
- mainMemoryTotalBytes,
- mainMemoryTotalMagnitude,
- )
- }
-
- swapMemory, err := psMem.SwapMemory()
- if err != nil {
- log.Printf("failed to get swap memory info from gopsutil: %v", err)
- } else {
- self.Data["Swap"] = append(self.Data["Swap"], swapMemory.UsedPercent)
- swapMemoryTotalBytes, swapMemoryTotalMagnitude := utils.ConvertBytes(swapMemory.Total)
- swapMemoryUsedBytes, swapMemoryUsedMagnitude := utils.ConvertBytes(swapMemory.Used)
- self.Labels["Swap"] = fmt.Sprintf("%3.0f%% %5.1f%s/%.0f%s",
- swapMemory.UsedPercent,
- swapMemoryUsedBytes,
- swapMemoryUsedMagnitude,
- swapMemoryTotalBytes,
- swapMemoryTotalMagnitude,
- )
- }
-}
diff --git a/src/widgets/mem_freebsd.go b/src/widgets/mem_freebsd.go
new file mode 100644
index 0000000..b3773c9
--- /dev/null
+++ b/src/widgets/mem_freebsd.go
@@ -0,0 +1,61 @@
+package widgets
+
+import (
+ "fmt"
+ "log"
+ "os/exec"
+ "strconv"
+ "strings"
+
+ "github.com/cjbassi/gotop/src/utils"
+)
+
+func convert(s []string) (MemoryInfo, error) {
+ total, err := strconv.ParseUint(s[0], 10, 64)
+ if err != nil {
+ return MemoryInfo{}, fmt.Errorf("int converion failed %v", err)
+ }
+
+ used, err := strconv.ParseUint(s[1], 10, 64)
+ if err != nil {
+ return MemoryInfo{}, fmt.Errorf("int converion failed %v", err)
+ }
+
+ percentage, err := strconv.ParseFloat(strings.TrimSuffix(s[2], "%"), 64)
+ if err != nil {
+ return MemoryInfo{}, fmt.Errorf("float converion failed %v", err)
+ }
+
+ return MemoryInfo{
+ Total: total * utils.KB,
+ Used: used * utils.KB,
+ UsedPercent: percentage,
+ }, nil
+}
+
+func gatherSwapInfo() (MemoryInfo, error) {
+ cmd := "swapinfo -k|sed -n '1!p'|awk '{print $2,$3,$5}'"
+ output, err := exec.Command("sh", "-c", cmd).Output()
+ if err != nil {
+ if err != nil {
+ return MemoryInfo{}, fmt.Errorf("command failed %v", err)
+ }
+ }
+
+ ss := strings.Split(strings.TrimSuffix(string(output), "\n"), " ")
+
+ return convert(ss)
+}
+
+func (self *MemWidget) updateSwapMemory() {
+ swapMemory, err := gatherSwapInfo()
+ if err != nil {
+ log.Printf("failed to get swap memory info from gopsutil: %v", err)
+ } else {
+ self.renderMemInfo("Swap", MemoryInfo{
+ Total: swapMemory.Total,
+ Used: swapMemory.Used,
+ UsedPercent: swapMemory.UsedPercent,
+ })
+ }
+}
diff --git a/src/widgets/mem_other.go b/src/widgets/mem_other.go
new file mode 100644
index 0000000..6b78acb
--- /dev/null
+++ b/src/widgets/mem_other.go
@@ -0,0 +1,22 @@
+// +build !freebsd
+
+package widgets
+
+import (
+ "log"
+
+ psMem "github.com/shirou/gopsutil/mem"
+)
+
+func (self *MemWidget) updateSwapMemory() {
+ swapMemory, err := psMem.SwapMemory()
+ if err != nil {
+ log.Printf("failed to get swap memory info from gopsutil: %v", err)
+ } else {
+ self.renderMemInfo("Swap", MemoryInfo{
+ Total: swapMemory.Total,
+ Used: swapMemory.Used,
+ UsedPercent: swapMemory.UsedPercent,
+ })
+ }
+}