mirror of https://github.com/containers/podman.git
				
				
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| // +build aix
 | |
| 
 | |
| package perfstat
 | |
| 
 | |
| /*
 | |
| #cgo LDFLAGS: -lperfstat
 | |
| 
 | |
| #include <libperfstat.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #include "c_helpers.h"
 | |
| */
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| func ProcessStat() ([]Process, error) {
 | |
| 	var proc *C.perfstat_process_t
 | |
| 	var first C.perfstat_id_t
 | |
| 
 | |
| 	numproc := C.perfstat_process(nil, nil, C.sizeof_perfstat_process_t, 0)
 | |
| 	if numproc < 1 {
 | |
| 		return nil, fmt.Errorf("perfstat_process() error")
 | |
| 	}
 | |
| 
 | |
| 	plen := C.sizeof_perfstat_process_t * C.ulong(numproc)
 | |
| 	proc = (*C.perfstat_process_t)(C.malloc(plen))
 | |
| 	defer C.free(unsafe.Pointer(proc))
 | |
| 	C.strcpy(&first.name[0], C.CString(""))
 | |
| 	r := C.perfstat_process(&first, proc, C.sizeof_perfstat_process_t, numproc)
 | |
| 	if r < 0 {
 | |
| 		return nil, fmt.Errorf("perfstat_process() error")
 | |
| 	}
 | |
| 
 | |
| 	ps := make([]Process, r)
 | |
| 	for i := 0; i < int(r); i++ {
 | |
| 		p := C.get_process_stat(proc, C.int(i))
 | |
| 		if p != nil {
 | |
| 			ps[i] = perfstatprocess2process(p)
 | |
| 		}
 | |
| 	}
 | |
| 	return ps, nil
 | |
| }
 | |
| 
 | |
| func ThreadStat() ([]Thread, error) {
 | |
| 	var thread *C.perfstat_thread_t
 | |
| 	var first C.perfstat_id_t
 | |
| 
 | |
| 	numthr := C.perfstat_thread(nil, nil, C.sizeof_perfstat_thread_t, 0)
 | |
| 	if numthr < 1 {
 | |
| 		return nil, fmt.Errorf("perfstat_thread() error")
 | |
| 	}
 | |
| 
 | |
| 	thlen := C.sizeof_perfstat_thread_t * C.ulong(numthr)
 | |
| 	thread = (*C.perfstat_thread_t)(C.malloc(thlen))
 | |
| 	defer C.free(unsafe.Pointer(thread))
 | |
| 	C.strcpy(&first.name[0], C.CString(""))
 | |
| 	r := C.perfstat_thread(&first, thread, C.sizeof_perfstat_thread_t, numthr)
 | |
| 	if r < 0 {
 | |
| 		return nil, fmt.Errorf("perfstat_thread() error")
 | |
| 	}
 | |
| 
 | |
| 	th := make([]Thread, r)
 | |
| 	for i := 0; i < int(r); i++ {
 | |
| 		t := C.get_thread_stat(thread, C.int(i))
 | |
| 		if t != nil {
 | |
| 			th[i] = perfstatthread2thread(t)
 | |
| 		}
 | |
| 	}
 | |
| 	return th, nil
 | |
| }
 |