From 494ac4a1e364c2b29b2fe9ca5b62ab8d36843fb2 Mon Sep 17 00:00:00 2001 From: KemoNine Date: Sun, 30 Aug 2020 19:46:07 -0400 Subject: [PATCH] Update vendoring --- go.mod | 3 +- go.sum | 2 + .../guillermo/go.procmeminfo/README.md | 28 ++ .../guillermo/go.procmeminfo/meminfo.go | 307 ++++++++++++++++++ .../mackerelio/go-osstat/LICENSE.txt | 178 ---------- .../go-osstat/memory/memory_darwin.go | 126 ------- .../go-osstat/memory/memory_freebsd.go | 118 ------- .../go-osstat/memory/memory_linux.go | 77 ----- .../go-osstat/memory/memory_other.go | 18 - .../go-osstat/memory/memory_windows.go | 53 --- vendor/modules.txt | 4 +- 11 files changed, 342 insertions(+), 572 deletions(-) create mode 100644 vendor/github.com/guillermo/go.procmeminfo/README.md create mode 100644 vendor/github.com/guillermo/go.procmeminfo/meminfo.go delete mode 100644 vendor/github.com/mackerelio/go-osstat/LICENSE.txt delete mode 100644 vendor/github.com/mackerelio/go-osstat/memory/memory_darwin.go delete mode 100644 vendor/github.com/mackerelio/go-osstat/memory/memory_freebsd.go delete mode 100644 vendor/github.com/mackerelio/go-osstat/memory/memory_linux.go delete mode 100644 vendor/github.com/mackerelio/go-osstat/memory/memory_other.go delete mode 100644 vendor/github.com/mackerelio/go-osstat/memory/memory_windows.go diff --git a/go.mod b/go.mod index 6c436ee..2cf49bb 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,8 @@ require ( github.com/eiannone/keyboard v0.0.0-20200508000154-caf4b762e807 github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell v1.4.0 - github.com/mackerelio/go-osstat v0.1.0 + github.com/guillermo/go.procmeminfo v0.0.0-20131127224636-be4355a9fb0e + github.com/mackerelio/go-osstat v0.1.0 // indirect github.com/rivo/tview v0.0.0-20200818120338-53d50e499bf9 gopkg.in/fsnotify.v1 v1.4.7 // indirect ) diff --git a/go.sum b/go.sum index 0986fae..b4e1acb 100644 --- a/go.sum +++ b/go.sum @@ -18,6 +18,8 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU= github.com/gdamore/tcell v1.4.0/go.mod h1:vxEiSDZdW3L+Uhjii9c3375IlDmR05bzxY404ZVSMo0= +github.com/guillermo/go.procmeminfo v0.0.0-20131127224636-be4355a9fb0e h1:/6/OurM62Ddm8CR8PveE0a+ql2mL+ycAhOwd563kpdg= +github.com/guillermo/go.procmeminfo v0.0.0-20131127224636-be4355a9fb0e/go.mod h1:TQrLAmkOSnZ4g1eFORtCfTEbFuVZD0Zm55vdnrilBaw= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= diff --git a/vendor/github.com/guillermo/go.procmeminfo/README.md b/vendor/github.com/guillermo/go.procmeminfo/README.md new file mode 100644 index 0000000..73ac032 --- /dev/null +++ b/vendor/github.com/guillermo/go.procmeminfo/README.md @@ -0,0 +1,28 @@ +# procmeminfo + +[![GoDoc](http://godoc.org/github.com/guillermo/go.procmeminfo?status.png)](http://godoc.org/github.com/guillermo/go.procmeminfo) + +Package procmeminfo provides an interface for /proc/meminfo + +```golang + import "github.com/guillermo/go.procmeminfo" + meminfo := &procmeminfo.MemInfo{} + meminfo.Update() + + (*meminfo)['Cached'] // Get cached memory + (*meminfo)['Buffers'] // Get buffers size + (*meminfo)['...'] // Any field in /proc/meminfo + + meminfo.Total() // Total memory size in bytes + meminfo.Free() // Free Memory (Free + Cached + Buffers) + meminfo.Used() // Total - Used +``` + + +## Docs + +Visit: http://godoc.org/github.com/guillermo/go.procmeminfo + +## LICENSE + +BSD diff --git a/vendor/github.com/guillermo/go.procmeminfo/meminfo.go b/vendor/github.com/guillermo/go.procmeminfo/meminfo.go new file mode 100644 index 0000000..3c55d26 --- /dev/null +++ b/vendor/github.com/guillermo/go.procmeminfo/meminfo.go @@ -0,0 +1,307 @@ +/* +Package procmeminfo provides an interface for /proc/meminfo + + import "github.com/guillermo/go.procmeminfo" + + meminfo := &procmeminfo.MemInfo{} + meminfo.Update() + +Once the info was updated you can access like a normal map[string]float64 + + v := (*meminfo)["MemTotal"] // 1809379328 (1766972 * 1024) + +It also implement some handy methods, like: + + meminfo.Total() // (*meminfo)["MemTotal"] + meminfo.Free() // MemFree + Buffers + Cached + meminfo.Used() // Total - Free + + +Return all the values in units, so while you get this from cat /proc/meminfo + + MemTotal: 1766972 kB + MemFree: 115752 kB + Buffers: 3172 kB + Cached: 182552 kB + SwapCached: 83572 kB + Active: 1055284 kB + Inactive: 382872 kB + Active(anon): 932712 kB + Inactive(anon): 329508 kB + Active(file): 122572 kB + Inactive(file): 53364 kB + Unevictable: 10640 kB + Mlocked: 10640 kB + SwapTotal: 1808668 kB + SwapFree: 1205672 kB + Dirty: 100 kB + Writeback: 0 kB + AnonPages: 1214740 kB + Mapped: 115636 kB + Shmem: 4840 kB + Slab: 77412 kB + SReclaimable: 34344 kB + SUnreclaim: 43068 kB + KernelStack: 4328 kB + PageTables: 39428 kB + NFS_Unstable: 0 kB + Bounce: 0 kB + WritebackTmp: 0 kB + CommitLimit: 2692152 kB + Committed_AS: 5448372 kB + VmallocTotal: 34359738367 kB + VmallocUsed: 106636 kB + VmallocChunk: 34359618556 kB + HardwareCorrupted: 0 kB + AnonHugePages: 0 kB + HugePages_Total: 0 + HugePages_Free: 0 + HugePages_Rsvd: 0 + HugePages_Surp: 0 + Hugepagesize: 2048 kB + DirectMap4k: 216236 kB + DirectMap2M: 1593344 kB + + +All the kB values are multiply by 1024 + +This is the info extracted from the man page of proc: + + + /proc/meminfo + This file reports statistics about memory usage on the system. It is used by free(1) to report the amount of free and used memory (both physical and swap) on the system as well as the shared memory and buffers used by the kernel. Each line of the file consists of a parameter name, followed by a colon, the value of + the parameter, and an option unit of measurement (e.g., "kB"). The list below describes the parameter names and the format specifier required to read the field value. Except as noted below, all of the fields have been present since at least Linux 2.6.0. Some fileds are displayed only if the kernel was configured + with various options; those dependencies are noted in the list. + + MemTotal %lu + Total usable RAM (i.e. physical RAM minus a few reserved bits and the kernel binary code). + + MemFree %lu + The sum of LowFree+HighFree. + + Buffers %lu + Relatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so). + + Cached %lu + In-memory cache for files read from the disk (the page cache). Doesn't include SwapCached. + + SwapCached %lu + Memory that once was swapped out, is swapped back in but still also is in the swap file. (If memory pressure is high, these pages don't need to be swapped out again because they are already in the swap file. This saves I/O.) + + Active %lu + Memory that has been used more recently and usually not reclaimed unless absolutely necessary. + + Inactive %lu + Memory which has been less recently used. It is more eligible to be reclaimed for other purposes. + + Active(anon) %lu (since Linux 2.6.28) + [To be documented.] + + Inactive(anon) %lu (since Linux 2.6.28) + [To be documented.] + + Active(file) %lu (since Linux 2.6.28) + [To be documented.] + + Inactive(file) %lu (since Linux 2.6.28) + [To be documented.] + + Unevictable %lu (since Linux 2.6.28) + (From Linux 2.6.28 to 2.6.30, CONFIG_UNEVICTABLE_LRU was required.) [To be documented.] + + Mlocked %lu (since Linux 2.6.28) + (From Linux 2.6.28 to 2.6.30, CONFIG_UNEVICTABLE_LRU was required.) [To be documented.] + + HighTotal %lu + (Starting with Linux 2.6.19, CONFIG_HIGHMEM is required.) Total amount of highmem. Highmem is all memory above ~860MB of physical memory. Highmem areas are for use by user-space programs, or for the page cache. The kernel must use tricks to access this memory, making it slower to access than lowmem. + + HighFree %lu + (Starting with Linux 2.6.19, CONFIG_HIGHMEM is required.) Amount of free highmem. + + LowTotal %lu + (Starting with Linux 2.6.19, CONFIG_HIGHMEM is required.) Total amount of lowmem. Lowmem is memory which can be used for everything that highmem can be used for, but it is also available for the kernel's use for its own data structures. Among many other things, it is where everything from Slab is allo‐ + cated. Bad things happen when you're out of lowmem. + + LowFree %lu + (Starting with Linux 2.6.19, CONFIG_HIGHMEM is required.) Amount of free lowmem. + + MmapCopy %lu (since Linux 2.6.29) + (CONFIG_MMU is required.) [To be documented.] + + SwapTotal %lu + Total amount of swap space available. + + SwapFree %lu + Amount of swap space that is currently unused. + + Dirty %lu + Memory which is waiting to get written back to the disk. + + Writeback %lu + Memory which is actively being written back to the disk. + + AnonPages %lu (since Linux 2.6.18) + Non-file backed pages mapped into user-space page tables. + + Mapped %lu + Files which have been mmaped, such as libraries. + + Shmem %lu (since Linux 2.6.32) + [To be documented.] + + Slab %lu + In-kernel data structures cache. + + SReclaimable %lu (since Linux 2.6.19) + Part of Slab, that might be reclaimed, such as caches. + + SUnreclaim %lu (since Linux 2.6.19) + Part of Slab, that cannot be reclaimed on memory pressure. + + KernelStack %lu (since Linux 2.6.32) + Amount of memory allocated to kernel stacks. + + PageTables %lu (since Linux 2.6.18) + Amount of memory dedicated to the lowest level of page tables. + + Quicklists %lu (since Linux 2.6.27) + (CONFIG_QUICKLIST is required.) [To be documented.] + + NFS_Unstable %lu (since Linux 2.6.18) + NFS pages sent to the server, but not yet committed to stable storage. + + Bounce %lu (since Linux 2.6.18) + Memory used for block device "bounce buffers". + + WritebackTmp %lu (since Linux 2.6.26) + Memory used by FUSE for temporary writeback buffers. + + CommitLimit %lu (since Linux 2.6.10) + Based on the overcommit ratio ('vm.overcommit_ratio'), this is the total amount of memory currently available to be allocated on the system. This limit is adhered to only if strict overcommit accounting is enabled (mode 2 in /proc/sys/vm/overcommit_ratio). The CommitLimit is calculated using the following + formula: + + CommitLimit = (overcommit_ratio * Physical RAM) + Swap + + For example, on a system with 1GB of physical RAM and 7GB of swap with a overcommit_ratio of 30, this formula yields a CommitLimit of 7.3GB. For more details, see the memory overcommit documentation in the kernel source file Documentation/vm/overcommit-accounting. + + Committed_AS %lu + The amount of memory presently allocated on the system. The committed memory is a sum of all of the memory which has been allocated by processes, even if it has not been "used" by them as of yet. A process which allocates 1GB of memory (using malloc(3) or similar), but touches only 300MB of that memory will + show up as using only 300MB of memory even if it has the address space allocated for the entire 1GB. This 1GB is memory which has been "committed" to by the VM and can be used at any time by the allocating application. With strict overcommit enabled on the system (mode 2 /proc/sys/vm/overcommit_memory), + allocations which would exceed the CommitLimit (detailed above) will not be permitted. This is useful if one needs to guarantee that processes will not fail due to lack of memory once that memory has been successfully allocated. + + VmallocTotal %lu + Total size of vmalloc memory area. + + VmallocUsed %lu + Amount of vmalloc area which is used. + + VmallocChunk %lu + Largest contiguous block of vmalloc area which is free. + + HardwareCorrupted %lu (since Linux 2.6.32) + (CONFIG_MEMORY_FAILURE is required.) [To be documented.] + + AnonHugePages %lu (since Linux 2.6.38) + (CONFIG_TRANSPARENT_HUGEPAGE is required.) Non-file backed huge pages mapped into user-space page tables. + + HugePages_Total %lu + (CONFIG_HUGETLB_PAGE is required.) The size of the pool of huge pages. + + HugePages_Free %lu + (CONFIG_HUGETLB_PAGE is required.) The number of huge pages in the pool that are not yet allocated. + + HugePages_Rsvd %lu (since Linux 2.6.17) + (CONFIG_HUGETLB_PAGE is required.) This is the number of huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made. These reserved huge pages guarantee that an application will be able to allocate a huge page from the pool of huge pages at fault time. + + HugePages_Surp %lu (since Linux 2.6.24) + (CONFIG_HUGETLB_PAGE is required.) This is the number of huge pages in the pool above the value in /proc/sys/vm/nr_hugepages. The maximum number of surplus huge pages is controlled by /proc/sys/vm/nr_overcommit_hugepages. + + Hugepagesize %lu + (CONFIG_HUGETLB_PAGE is required.) The size of huge pages. +*/ +package procmeminfo + +import ( + "bufio" + "os" + "path/filepath" + "strconv" + "strings" +) + +// MemInfo is a map[string]uint64 with all the values found in /proc/meminfo +type MemInfo map[string]uint64 + +// Update s with current values, usign the pid stored in the Stat +func (m *MemInfo) Update() error { + var err error + + path := filepath.Join("/proc/meminfo") + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + text := scanner.Text() + + n := strings.Index(text, ":") + if n == -1 { + continue + } + + key := text[:n] // metric + data := strings.Split(strings.Trim(text[(n+1):], " "), " ") + if len(data) == 1 { + value, err := strconv.ParseUint(data[0], 10, 64) + if err != nil { + continue + } + (*m)[key] = value + } else if len(data) == 2 { + if data[1] == "kB" { + value, err := strconv.ParseUint(data[0], 10, 64) + if err != nil { + continue + } + (*m)[key] = value * 1024 + } + } + + } + return nil + +} + +// Total return the size of the memory in bytes. +// It is an alias of (*m)["MemInfo"] +func (m *MemInfo) Total() uint64 { + return (*m)["MemTotal"] +} + +// Available return the available memory following this formula: +// +// Available = Free + Buffers + Cached +func (m *MemInfo) Available() uint64 { + d := *m + return d["MemFree"] + d["Buffers"] + d["Cached"] +} + +// Used is a generic way of reporting used memory. It follows the next formula: +// +// Used = Total - Available +func (m *MemInfo) Used() uint64 { + return m.Total() - m.Available() +} + +// Swap returns the % of swap used +func (m *MemInfo) Swap() int { + total := (*m)["SwapTotal"] + free := (*m)["SwapFree"] + if total == 0 { + return 0 + } + return int((100 * (total - free)) / total) +} diff --git a/vendor/github.com/mackerelio/go-osstat/LICENSE.txt b/vendor/github.com/mackerelio/go-osstat/LICENSE.txt deleted file mode 100644 index e454a52..0000000 --- a/vendor/github.com/mackerelio/go-osstat/LICENSE.txt +++ /dev/null @@ -1,178 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - diff --git a/vendor/github.com/mackerelio/go-osstat/memory/memory_darwin.go b/vendor/github.com/mackerelio/go-osstat/memory/memory_darwin.go deleted file mode 100644 index 1990241..0000000 --- a/vendor/github.com/mackerelio/go-osstat/memory/memory_darwin.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build darwin - -package memory - -import ( - "bufio" - "context" - "fmt" - "io" - "os/exec" - "strconv" - "strings" - "time" - "unsafe" - - "golang.org/x/sys/unix" -) - -// Get memory statistics -func Get() (*Stats, error) { - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - // Reference: man 1 vm_stat - cmd := exec.CommandContext(ctx, "vm_stat") - out, err := cmd.StdoutPipe() - if err != nil { - return nil, err - } - if err := cmd.Start(); err != nil { - return nil, err - } - memory, err := collectMemoryStats(out) - if err != nil { - go cmd.Wait() - return nil, err - } - if err := cmd.Wait(); err != nil { - return nil, err - } - - // Reference: sys/sysctl.h, man 3 sysctl, sysctl vm.swapusage - ret, err := unix.SysctlRaw("vm.swapusage") - if err != nil { - return nil, fmt.Errorf("failed in sysctl vm.swapusage: %s", err) - } - swap, err := collectSwapStats(ret) - if err != nil { - return nil, err - } - memory.SwapTotal = swap.Total - memory.SwapUsed = swap.Used - memory.SwapFree = swap.Avail - - return memory, nil -} - -// Stats represents memory statistics for darwin -type Stats struct { - Total, Used, Cached, Free, Active, Inactive, SwapTotal, SwapUsed, SwapFree uint64 -} - -// References: -// - https://support.apple.com/en-us/HT201464#memory -// - https://developer.apple.com/library/content/documentation/Performance/Conceptual/ManagingMemoryStats/Articles/AboutMemoryStats.html -// - https://opensource.apple.com/source/system_cmds/system_cmds-790/vm_stat.tproj/ -func collectMemoryStats(out io.Reader) (*Stats, error) { - scanner := bufio.NewScanner(out) - if !scanner.Scan() { - return nil, fmt.Errorf("failed to scan output of vm_stat") - } - line := scanner.Text() - if !strings.HasPrefix(line, "Mach Virtual Memory Statistics:") { - return nil, fmt.Errorf("unexpected output of vm_stat: %s", line) - } - - var memory Stats - var speculative, wired, purgeable, fileBacked, compressed uint64 - memStats := map[string]*uint64{ - "Pages free": &memory.Free, - "Pages active": &memory.Active, - "Pages inactive": &memory.Inactive, - "Pages speculative": &speculative, - "Pages wired down": &wired, - "Pages purgeable": &purgeable, - "File-backed pages": &fileBacked, - "Pages occupied by compressor": &compressed, - } - for scanner.Scan() { - line := scanner.Text() - i := strings.IndexRune(line, ':') - if i < 0 { - continue - } - if ptr := memStats[line[:i]]; ptr != nil { - val := strings.TrimRight(strings.TrimSpace(line[i+1:]), ".") - if v, err := strconv.ParseUint(val, 10, 64); err == nil { - *ptr = v * 4096 - } - } - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("scan error for vm_stat: %s", err) - } - - memory.Cached = purgeable + fileBacked - memory.Used = wired + compressed + memory.Active + memory.Inactive + speculative - memory.Cached - memory.Total = memory.Used + memory.Cached + memory.Free - return &memory, nil -} - -// xsw_usage in sys/sysctl.h -type swapUsage struct { - Total uint64 - Avail uint64 - Used uint64 - Pagesize int32 - Encrypted bool -} - -func collectSwapStats(out []byte) (*swapUsage, error) { - if len(out) != 32 { - return nil, fmt.Errorf("unexpected output of sysctl vm.swapusage: %v (len: %d)", out, len(out)) - } - return (*swapUsage)(unsafe.Pointer(&out[0])), nil -} diff --git a/vendor/github.com/mackerelio/go-osstat/memory/memory_freebsd.go b/vendor/github.com/mackerelio/go-osstat/memory/memory_freebsd.go deleted file mode 100644 index 03b8d1d..0000000 --- a/vendor/github.com/mackerelio/go-osstat/memory/memory_freebsd.go +++ /dev/null @@ -1,118 +0,0 @@ -// +build freebsd - -package memory - -import ( - "bufio" - "context" - "fmt" - "io" - "os/exec" - "strconv" - "strings" - "time" - "unsafe" - - "golang.org/x/sys/unix" -) - -// Get memory statistics -func Get() (*Stats, error) { - return collectMemoryStats() -} - -// Stats represents memory statistics for freebsd -type Stats struct { - Total, Used, Cached, Free, Active, Inactive, Wired, - SwapTotal, SwapUsed, SwapFree uint64 -} - -type memStat struct { - name string - ptr *uint64 - scale *uint64 -} - -func collectMemoryStats() (*Stats, error) { - var pageSize uint64 - one := uint64(1) - - var memory Stats - memStats := []memStat{ - {"vm.stats.vm.v_page_size", &pageSize, &one}, - {"hw.physmem", &memory.Total, &one}, - {"vm.stats.vm.v_cache_count", &memory.Cached, &pageSize}, - {"vm.stats.vm.v_free_count", &memory.Free, &pageSize}, - {"vm.stats.vm.v_active_count", &memory.Active, &pageSize}, - {"vm.stats.vm.v_inactive_count", &memory.Inactive, &pageSize}, - {"vm.stats.vm.v_wire_count", &memory.Wired, &pageSize}, - } - - for _, stat := range memStats { - ret, err := unix.SysctlRaw(stat.name) - if err != nil { - return nil, fmt.Errorf("failed in sysctl %s: %s", stat.name, err) - } - if len(ret) == 8 { - *stat.ptr = *(*uint64)(unsafe.Pointer(&ret[0])) * *stat.scale - } else if len(ret) == 4 { - *stat.ptr = uint64(*(*uint32)(unsafe.Pointer(&ret[0]))) * *stat.scale - } else { - return nil, fmt.Errorf("failed in sysctl %s: %s", stat.name, err) - } - } - - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - // collect swap statistics from swapinfo command - cmd := exec.CommandContext(ctx, "swapinfo", "-k") - out, err := cmd.StdoutPipe() - if err != nil { - return nil, err - } - if err := cmd.Start(); err != nil { - return nil, err - } - memory.SwapTotal, memory.SwapUsed, err = collectSwapStats(out) - if err != nil { - go cmd.Wait() - return nil, err - } - if err := cmd.Wait(); err != nil { - return nil, err - } - - memory.Used = memory.Total - memory.Free - memory.Cached - memory.Inactive - memory.SwapFree = memory.SwapTotal - memory.SwapUsed - - return &memory, nil -} - -func collectSwapStats(out io.Reader) (uint64, uint64, error) { - scanner := bufio.NewScanner(out) - if !scanner.Scan() { - return 0, 0, fmt.Errorf("failed to scan output of swapinfo") - } - line := scanner.Text() - if !strings.HasPrefix(line, "Device") { - return 0, 0, fmt.Errorf("unexpected output of swapinfo: %s", line) - } - - var total, used uint64 - for scanner.Scan() { - line := scanner.Text() - fields := strings.Fields(line) - if len(fields) < 5 { - continue - } - if v, err := strconv.ParseUint(fields[1], 10, 64); err == nil { - total += v * 1024 - } - if v, err := strconv.ParseUint(fields[2], 10, 64); err == nil { - used += v * 1024 - } - } - - return total, used, nil -} diff --git a/vendor/github.com/mackerelio/go-osstat/memory/memory_linux.go b/vendor/github.com/mackerelio/go-osstat/memory/memory_linux.go deleted file mode 100644 index 5b5a0df..0000000 --- a/vendor/github.com/mackerelio/go-osstat/memory/memory_linux.go +++ /dev/null @@ -1,77 +0,0 @@ -// +build linux - -package memory - -import ( - "bufio" - "fmt" - "io" - "os" - "strconv" - "strings" -) - -// Get memory statistics -func Get() (*Stats, error) { - // Reference: man 5 proc, Documentation/filesystems/proc.txt in Linux source code - file, err := os.Open("/proc/meminfo") - if err != nil { - return nil, err - } - defer file.Close() - return collectMemoryStats(file) -} - -// Stats represents memory statistics for linux -type Stats struct { - Total, Used, Buffers, Cached, Free, Available, Active, Inactive, - SwapTotal, SwapUsed, SwapCached, SwapFree uint64 - MemAvailableEnabled bool -} - -func collectMemoryStats(out io.Reader) (*Stats, error) { - scanner := bufio.NewScanner(out) - var memory Stats - memStats := map[string]*uint64{ - "MemTotal": &memory.Total, - "MemFree": &memory.Free, - "MemAvailable": &memory.Available, - "Buffers": &memory.Buffers, - "Cached": &memory.Cached, - "Active": &memory.Active, - "Inactive": &memory.Inactive, - "SwapCached": &memory.SwapCached, - "SwapTotal": &memory.SwapTotal, - "SwapFree": &memory.SwapFree, - } - for scanner.Scan() { - line := scanner.Text() - i := strings.IndexRune(line, ':') - if i < 0 { - continue - } - fld := line[:i] - if ptr := memStats[fld]; ptr != nil { - val := strings.TrimSpace(strings.TrimRight(line[i+1:], "kB")) - if v, err := strconv.ParseUint(val, 10, 64); err == nil { - *ptr = v * 1024 - } - if fld == "MemAvailable" { - memory.MemAvailableEnabled = true - } - } - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("scan error for /proc/meminfo: %s", err) - } - - memory.SwapUsed = memory.SwapTotal - memory.SwapFree - - if memory.MemAvailableEnabled { - memory.Used = memory.Total - memory.Available - } else { - memory.Used = memory.Total - memory.Free - memory.Buffers - memory.Cached - } - - return &memory, nil -} diff --git a/vendor/github.com/mackerelio/go-osstat/memory/memory_other.go b/vendor/github.com/mackerelio/go-osstat/memory/memory_other.go deleted file mode 100644 index 35b1f08..0000000 --- a/vendor/github.com/mackerelio/go-osstat/memory/memory_other.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build !linux,!darwin,!windows,!freebsd - -package memory - -import ( - "fmt" - "runtime" -) - -// Get memory statistics -func Get() (*Stats, error) { - return nil, fmt.Errorf("memory statistics not implemented for: %s", runtime.GOOS) -} - -// Stats represents memory statistics -type Stats struct { - Total, Used, Cached, Free, Active, Inactive, SwapTotal, SwapUsed, SwapFree uint64 -} diff --git a/vendor/github.com/mackerelio/go-osstat/memory/memory_windows.go b/vendor/github.com/mackerelio/go-osstat/memory/memory_windows.go deleted file mode 100644 index ac7d865..0000000 --- a/vendor/github.com/mackerelio/go-osstat/memory/memory_windows.go +++ /dev/null @@ -1,53 +0,0 @@ -// +build windows - -package memory - -import ( - "fmt" - "syscall" - "unsafe" -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - globalMemoryStatusEx = kernel32.NewProc("GlobalMemoryStatusEx") -) - -// Get memory statistics -func Get() (*Stats, error) { - var memoryStatus memoryStatusEx - memoryStatus.Length = uint32(unsafe.Sizeof(memoryStatus)) - - ret, _, err := globalMemoryStatusEx.Call(uintptr(unsafe.Pointer(&memoryStatus))) - if ret == 0 { - return nil, fmt.Errorf("failed in GlobalMemoryStatusEx: %s", err) - } - - var memory Stats - memory.Free = memoryStatus.AvailPhys - memory.Total = memoryStatus.TotalPhys - memory.Used = memory.Total - memory.Free - memory.PageFileTotal = memoryStatus.TotalPageFile - memory.PageFileFree = memoryStatus.AvailPageFile - memory.VirtualTotal = memoryStatus.TotalVirtual - memory.VirtualFree = memoryStatus.AvailVirtual - - return &memory, nil -} - -type memoryStatusEx struct { - Length uint32 - MemoryLoad uint32 - TotalPhys uint64 - AvailPhys uint64 - TotalPageFile uint64 - AvailPageFile uint64 - TotalVirtual uint64 - AvailVirtual uint64 - AvailExtendedVirtual uint64 -} - -// Stats represents memory statistics for Windows -type Stats struct { - Total, Used, Free, PageFileTotal, PageFileFree, VirtualTotal, VirtualFree uint64 -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 6b09170..dff97ba 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -68,11 +68,13 @@ github.com/gdamore/tcell/terminfo/x/xfce github.com/gdamore/tcell/terminfo/x/xnuppc github.com/gdamore/tcell/terminfo/x/xterm github.com/gdamore/tcell/terminfo/x/xterm_kitty +# github.com/guillermo/go.procmeminfo v0.0.0-20131127224636-be4355a9fb0e +## explicit +github.com/guillermo/go.procmeminfo # github.com/lucasb-eyer/go-colorful v1.0.3 github.com/lucasb-eyer/go-colorful # github.com/mackerelio/go-osstat v0.1.0 ## explicit -github.com/mackerelio/go-osstat/memory # github.com/mattn/go-runewidth v0.0.9 github.com/mattn/go-runewidth # github.com/rivo/tview v0.0.0-20200818120338-53d50e499bf9