1// Copyright 2019 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build unix 6 7package pprof 8 9import ( 10 "syscall" 11 "time" 12) 13 14func init() { 15 diffCPUTimeImpl = diffCPUTimeRUsage 16} 17 18func diffCPUTimeRUsage(f func()) (user, system time.Duration) { 19 ok := true 20 var before, after syscall.Rusage 21 22 err := syscall.Getrusage(syscall.RUSAGE_SELF, &before) 23 if err != nil { 24 ok = false 25 } 26 27 f() 28 29 err = syscall.Getrusage(syscall.RUSAGE_SELF, &after) 30 if err != nil { 31 ok = false 32 } 33 34 if !ok { 35 return 0, 0 36 } 37 38 user = time.Duration(after.Utime.Nano() - before.Utime.Nano()) 39 system = time.Duration(after.Stime.Nano() - before.Stime.Nano()) 40 return user, system 41} 42