cpustat.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. func CpuStat() ([]CPU, error) {
  18. var cpustat *C.perfstat_cpu_t
  19. var cpu C.perfstat_id_t
  20. ncpu := runtime.NumCPU()
  21. cpustat_len := C.sizeof_perfstat_cpu_t * C.ulong(ncpu)
  22. cpustat = (*C.perfstat_cpu_t)(C.malloc(cpustat_len))
  23. defer C.free(unsafe.Pointer(cpustat))
  24. C.strcpy(&cpu.name[0], C.CString(C.FIRST_CPU))
  25. r := C.perfstat_cpu(&cpu, cpustat, C.sizeof_perfstat_cpu_t, C.int(ncpu))
  26. if r <= 0 {
  27. return nil, fmt.Errorf("error perfstat_cpu()")
  28. }
  29. c := make([]CPU, r)
  30. for i := 0; i < int(r); i++ {
  31. n := C.get_cpu_stat(cpustat, C.int(i))
  32. if n != nil {
  33. c[i] = perfstatcpu2cpu(n)
  34. }
  35. }
  36. return c, nil
  37. }
  38. func CpuTotalStat() (*CPUTotal, error) {
  39. var cpustat *C.perfstat_cpu_total_t
  40. cpustat = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  41. defer C.free(unsafe.Pointer(cpustat))
  42. r := C.perfstat_cpu_total(nil, cpustat, C.sizeof_perfstat_cpu_total_t, 1)
  43. if r <= 0 {
  44. return nil, fmt.Errorf("error perfstat_cpu_total()")
  45. }
  46. c := perfstatcputotal2cputotal(cpustat)
  47. return &c, nil
  48. }
  49. func CpuUtilStat(intvl time.Duration) (*CPUUtil, error) {
  50. var cpuutil *C.perfstat_cpu_util_t
  51. var newt *C.perfstat_cpu_total_t
  52. var oldt *C.perfstat_cpu_total_t
  53. var data C.perfstat_rawdata_t
  54. oldt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  55. newt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
  56. cpuutil = (*C.perfstat_cpu_util_t)(C.malloc(C.sizeof_perfstat_cpu_util_t))
  57. defer C.free(unsafe.Pointer(oldt))
  58. defer C.free(unsafe.Pointer(newt))
  59. defer C.free(unsafe.Pointer(cpuutil))
  60. r := C.perfstat_cpu_total(nil, oldt, C.sizeof_perfstat_cpu_total_t, 1)
  61. if r <= 0 {
  62. return nil, fmt.Errorf("error perfstat_cpu_total()")
  63. }
  64. time.Sleep(intvl)
  65. r = C.perfstat_cpu_total(nil, newt, C.sizeof_perfstat_cpu_total_t, 1)
  66. if r <= 0 {
  67. return nil, fmt.Errorf("error perfstat_cpu_total()")
  68. }
  69. data._type = C.UTIL_CPU_TOTAL
  70. data.curstat = unsafe.Pointer(newt)
  71. data.prevstat = unsafe.Pointer(oldt)
  72. data.sizeof_data = C.sizeof_perfstat_cpu_total_t
  73. data.cur_elems = 1
  74. data.prev_elems = 1
  75. r = C.perfstat_cpu_util(&data, cpuutil, C.sizeof_perfstat_cpu_util_t, 1)
  76. if r <= 0 {
  77. return nil, fmt.Errorf("error perfstat_cpu_util()")
  78. }
  79. u := perfstatcpuutil2cpuutil(cpuutil)
  80. return &u, nil
  81. }