cpustat.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //go:build aix
  2. // +build aix
  3. package perfstat
  4. /*
  5. #cgo LDFLAGS: -lperfstat
  6. #include <libperfstat.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "c_helpers.h"
  10. */
  11. import "C"
  12. import (
  13. "fmt"
  14. "runtime"
  15. "time"
  16. "unsafe"
  17. )
  18. var old_cpu_total_stat *C.perfstat_cpu_total_t
  19. func init() {
  20. old_cpu_total_stat = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  21. C.perfstat_cpu_total(nil, old_cpu_total_stat, C.sizeof_perfstat_cpu_total_t, 1)
  22. }
  23. func CpuStat() ([]CPU, error) {
  24. var cpustat *C.perfstat_cpu_t
  25. var cpu C.perfstat_id_t
  26. ncpu := runtime.NumCPU()
  27. cpustat_len := C.sizeof_perfstat_cpu_t * C.ulong(ncpu)
  28. cpustat = (*C.perfstat_cpu_t)(C.malloc(cpustat_len))
  29. defer C.free(unsafe.Pointer(cpustat))
  30. C.strcpy(&cpu.name[0], C.CString(C.FIRST_CPU))
  31. r := C.perfstat_cpu(&cpu, cpustat, C.sizeof_perfstat_cpu_t, C.int(ncpu))
  32. if r <= 0 {
  33. return nil, fmt.Errorf("error perfstat_cpu()")
  34. }
  35. c := make([]CPU, r)
  36. for i := 0; i < int(r); i++ {
  37. n := C.get_cpu_stat(cpustat, C.int(i))
  38. if n != nil {
  39. c[i] = perfstatcpu2cpu(n)
  40. }
  41. }
  42. return c, nil
  43. }
  44. func CpuTotalStat() (*CPUTotal, error) {
  45. var cpustat *C.perfstat_cpu_total_t
  46. cpustat = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  47. defer C.free(unsafe.Pointer(cpustat))
  48. r := C.perfstat_cpu_total(nil, cpustat, C.sizeof_perfstat_cpu_total_t, 1)
  49. if r <= 0 {
  50. return nil, fmt.Errorf("error perfstat_cpu_total()")
  51. }
  52. c := perfstatcputotal2cputotal(cpustat)
  53. return &c, nil
  54. }
  55. func CpuUtilStat(intvl time.Duration) (*CPUUtil, error) {
  56. var cpuutil *C.perfstat_cpu_util_t
  57. var newt *C.perfstat_cpu_total_t
  58. var oldt *C.perfstat_cpu_total_t
  59. var data C.perfstat_rawdata_t
  60. oldt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  61. newt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  62. cpuutil = (*C.perfstat_cpu_util_t)(C.malloc(C.sizeof_perfstat_cpu_util_t))
  63. defer C.free(unsafe.Pointer(oldt))
  64. defer C.free(unsafe.Pointer(newt))
  65. defer C.free(unsafe.Pointer(cpuutil))
  66. r := C.perfstat_cpu_total(nil, oldt, C.sizeof_perfstat_cpu_total_t, 1)
  67. if r <= 0 {
  68. return nil, fmt.Errorf("error perfstat_cpu_total()")
  69. }
  70. time.Sleep(intvl)
  71. r = C.perfstat_cpu_total(nil, newt, C.sizeof_perfstat_cpu_total_t, 1)
  72. if r <= 0 {
  73. return nil, fmt.Errorf("error perfstat_cpu_total()")
  74. }
  75. data._type = C.UTIL_CPU_TOTAL
  76. data.curstat = unsafe.Pointer(newt)
  77. data.prevstat = unsafe.Pointer(oldt)
  78. data.sizeof_data = C.sizeof_perfstat_cpu_total_t
  79. data.cur_elems = 1
  80. data.prev_elems = 1
  81. r = C.perfstat_cpu_util(&data, cpuutil, C.sizeof_perfstat_cpu_util_t, 1)
  82. if r <= 0 {
  83. return nil, fmt.Errorf("error perfstat_cpu_util()")
  84. }
  85. u := perfstatcpuutil2cpuutil(cpuutil)
  86. return &u, nil
  87. }
  88. func CpuUtilTotalStat() (*CPUUtil, error) {
  89. var cpuutil *C.perfstat_cpu_util_t
  90. var new_cpu_total_stat *C.perfstat_cpu_total_t
  91. var data C.perfstat_rawdata_t
  92. new_cpu_total_stat = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  93. cpuutil = (*C.perfstat_cpu_util_t)(C.malloc(C.sizeof_perfstat_cpu_util_t))
  94. defer C.free(unsafe.Pointer(cpuutil))
  95. r := C.perfstat_cpu_total(nil, new_cpu_total_stat, C.sizeof_perfstat_cpu_total_t, 1)
  96. if r <= 0 {
  97. C.free(unsafe.Pointer(new_cpu_total_stat))
  98. return nil, fmt.Errorf("error perfstat_cpu_total()")
  99. }
  100. data._type = C.UTIL_CPU_TOTAL
  101. data.curstat = unsafe.Pointer(new_cpu_total_stat)
  102. data.prevstat = unsafe.Pointer(old_cpu_total_stat)
  103. data.sizeof_data = C.sizeof_perfstat_cpu_total_t
  104. data.cur_elems = 1
  105. data.prev_elems = 1
  106. r = C.perfstat_cpu_util(&data, cpuutil, C.sizeof_perfstat_cpu_util_t, 1)
  107. C.free(unsafe.Pointer(old_cpu_total_stat))
  108. old_cpu_total_stat = new_cpu_total_stat
  109. if r <= 0 {
  110. return nil, fmt.Errorf("error perfstat_cpu_util()")
  111. }
  112. u := perfstatcpuutil2cpuutil(cpuutil)
  113. return &u, nil
  114. }