cpustat.go 3.7 KB

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