sigar_freebsd.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copied and modified from sigar_linux.go.
  2. package gosigar
  3. import (
  4. "io/ioutil"
  5. "runtime"
  6. "strconv"
  7. "strings"
  8. "unsafe"
  9. )
  10. /*
  11. #include <sys/param.h>
  12. #include <sys/mount.h>
  13. #include <sys/ucred.h>
  14. #include <sys/types.h>
  15. #include <sys/sysctl.h>
  16. #include <stdlib.h>
  17. #include <stdint.h>
  18. #include <unistd.h>
  19. #include <time.h>
  20. */
  21. import "C"
  22. func init() {
  23. system.ticks = uint64(C.sysconf(C._SC_CLK_TCK))
  24. Procd = "/compat/linux/proc"
  25. getLinuxBootTime()
  26. }
  27. func getMountTableFileName() string {
  28. return Procd + "/mtab"
  29. }
  30. func (self *Uptime) Get() error {
  31. ts := C.struct_timespec{}
  32. if _, err := C.clock_gettime(C.CLOCK_UPTIME, &ts); err != nil {
  33. return err
  34. }
  35. self.Length = float64(ts.tv_sec) + 1e-9*float64(ts.tv_nsec)
  36. return nil
  37. }
  38. func (self *FDUsage) Get() error {
  39. val := C.uint32_t(0)
  40. sc := C.size_t(4)
  41. name := C.CString("kern.openfiles")
  42. _, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
  43. C.free(unsafe.Pointer(name))
  44. if err != nil {
  45. return err
  46. }
  47. self.Open = uint64(val)
  48. name = C.CString("kern.maxfiles")
  49. _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0)
  50. C.free(unsafe.Pointer(name))
  51. if err != nil {
  52. return err
  53. }
  54. self.Max = uint64(val)
  55. self.Unused = self.Max - self.Open
  56. return nil
  57. }
  58. func (self *ProcFDUsage) Get(pid int) error {
  59. err := readFile("/proc/"+strconv.Itoa(pid)+"/rlimit", func(line string) bool {
  60. if strings.HasPrefix(line, "nofile") {
  61. fields := strings.Fields(line)
  62. if len(fields) == 3 {
  63. self.SoftLimit, _ = strconv.ParseUint(fields[1], 10, 64)
  64. self.HardLimit, _ = strconv.ParseUint(fields[2], 10, 64)
  65. }
  66. return false
  67. }
  68. return true
  69. })
  70. if err != nil {
  71. return err
  72. }
  73. // linprocfs only provides this information for this process (self).
  74. fds, err := ioutil.ReadDir(procFileName(pid, "fd"))
  75. if err != nil {
  76. return err
  77. }
  78. self.Open = uint64(len(fds))
  79. return nil
  80. }
  81. func (self *HugeTLBPages) Get() error {
  82. return ErrNotImplemented{runtime.GOOS}
  83. }
  84. func parseCpuStat(self *Cpu, line string) error {
  85. fields := strings.Fields(line)
  86. self.User, _ = strtoull(fields[1])
  87. self.Nice, _ = strtoull(fields[2])
  88. self.Sys, _ = strtoull(fields[3])
  89. self.Idle, _ = strtoull(fields[4])
  90. return nil
  91. }