mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +build aix
 | |
| 
 | |
| package perfstat
 | |
| 
 | |
| /*
 | |
| #cgo LDFLAGS: -lperfstat
 | |
| 
 | |
| #include <libperfstat.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| #include "c_helpers.h"
 | |
| */
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"runtime"
 | |
| 	"time"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| func CpuStat() ([]CPU, error) {
 | |
| 	var cpustat *C.perfstat_cpu_t
 | |
| 	var cpu C.perfstat_id_t
 | |
| 
 | |
| 	ncpu := runtime.NumCPU()
 | |
| 
 | |
| 	cpustat_len := C.sizeof_perfstat_cpu_t * C.ulong(ncpu)
 | |
| 	cpustat = (*C.perfstat_cpu_t)(C.malloc(cpustat_len))
 | |
| 	defer C.free(unsafe.Pointer(cpustat))
 | |
| 	C.strcpy(&cpu.name[0], C.CString(C.FIRST_CPU))
 | |
| 	r := C.perfstat_cpu(&cpu, cpustat, C.sizeof_perfstat_cpu_t, C.int(ncpu))
 | |
| 	if r <= 0 {
 | |
| 		return nil, fmt.Errorf("error perfstat_cpu()")
 | |
| 	}
 | |
| 	c := make([]CPU, r)
 | |
| 	for i := 0; i < int(r); i++ {
 | |
| 		n := C.get_cpu_stat(cpustat, C.int(i))
 | |
| 		if n != nil {
 | |
| 			c[i] = perfstatcpu2cpu(n)
 | |
| 		}
 | |
| 	}
 | |
| 	return c, nil
 | |
| }
 | |
| 
 | |
| func CpuTotalStat() (*CPUTotal, error) {
 | |
| 	var cpustat *C.perfstat_cpu_total_t
 | |
| 
 | |
| 	cpustat = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
 | |
| 	defer C.free(unsafe.Pointer(cpustat))
 | |
| 	r := C.perfstat_cpu_total(nil, cpustat, C.sizeof_perfstat_cpu_total_t, 1)
 | |
| 	if r <= 0 {
 | |
| 		return nil, fmt.Errorf("error perfstat_cpu_total()")
 | |
| 	}
 | |
| 	c := perfstatcputotal2cputotal(cpustat)
 | |
| 	return &c, nil
 | |
| }
 | |
| 
 | |
| func CpuUtilStat(intvl time.Duration) (*CPUUtil, error) {
 | |
| 	var cpuutil *C.perfstat_cpu_util_t
 | |
| 	var newt *C.perfstat_cpu_total_t
 | |
| 	var oldt *C.perfstat_cpu_total_t
 | |
| 	var data C.perfstat_rawdata_t
 | |
| 
 | |
| 	oldt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
 | |
| 	newt = (*C.perfstat_cpu_total_t)(C.malloc(C.sizeof_perfstat_cpu_total_t))
 | |
| 	cpuutil = (*C.perfstat_cpu_util_t)(C.malloc(C.sizeof_perfstat_cpu_util_t))
 | |
| 	defer C.free(unsafe.Pointer(oldt))
 | |
| 	defer C.free(unsafe.Pointer(newt))
 | |
| 	defer C.free(unsafe.Pointer(cpuutil))
 | |
| 
 | |
| 	r := C.perfstat_cpu_total(nil, oldt, C.sizeof_perfstat_cpu_total_t, 1)
 | |
| 	if r <= 0 {
 | |
| 		return nil, fmt.Errorf("error perfstat_cpu_total()")
 | |
| 	}
 | |
| 
 | |
| 	time.Sleep(intvl)
 | |
| 
 | |
| 	r = C.perfstat_cpu_total(nil, newt, C.sizeof_perfstat_cpu_total_t, 1)
 | |
| 	if r <= 0 {
 | |
| 		return nil, fmt.Errorf("error perfstat_cpu_total()")
 | |
| 	}
 | |
| 
 | |
| 	data._type = C.UTIL_CPU_TOTAL
 | |
| 	data.curstat = unsafe.Pointer(newt)
 | |
| 	data.prevstat = unsafe.Pointer(oldt)
 | |
| 	data.sizeof_data = C.sizeof_perfstat_cpu_total_t
 | |
| 	data.cur_elems = 1
 | |
| 	data.prev_elems = 1
 | |
| 
 | |
| 	r = C.perfstat_cpu_util(&data, cpuutil, C.sizeof_perfstat_cpu_util_t, 1)
 | |
| 	if r <= 0 {
 | |
| 		return nil, fmt.Errorf("error perfstat_cpu_util()")
 | |
| 	}
 | |
| 	u := perfstatcpuutil2cpuutil(cpuutil)
 | |
| 	return &u, nil
 | |
| }
 |