-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.go
62 lines (56 loc) · 1.29 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package logger
import (
"reflect"
"runtime"
"strconv"
"unsafe"
)
type Logger struct {
}
func Info0() {
gp := procPin()
prevWriteBuf := gp.writebuf
prevG0WriteBuf := gp.m.g0.writebuf
gp.writebuf = *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{
Data: uintptr(unsafe.Pointer(gp)),
Len: 0,
Cap: 0,
}))
gp.m.g0.writebuf = gp.writebuf
systemstack(func() {
this := getg()
gpp := (*g)(unsafe.Pointer((*reflect.SliceHeader)(unsafe.Pointer(&this.writebuf)).Data))
//this.writebuf = nil
var sp0 uintptr
if gpp.syscallsp != 0 {
sp0 = gpp.syscallsp
} else {
sp0 = gpp.sched.sp
}
sp := sp0 + callerSPOffset
(*reflect.SliceHeader)(unsafe.Pointer(&gpp.writebuf)).Data = sp
})
sp := *(*uintptr)(unsafe.Pointer(&gp.writebuf))
gp.writebuf = prevWriteBuf
gp.m.g0.writebuf = prevG0WriteBuf
pc := *(*uintptr)(unsafe.Pointer(sp))
procUnpinGp(gp)
f := funcInfoMap.GetForPC(pc)
println("INF", f.String())
}
func Info() {
pc, file, line, ok := runtime.Caller(1)
_ = file
_ = line
_ = ok
f := funcInfoMap.GetForPC(pc)
println("INF", f.String(), file+":"+strconv.FormatInt(int64(line), 10))
}
func Err() {
pc, file, line, ok := runtime.Caller(1)
_ = file
_ = line
_ = ok
f := funcInfoMap.GetForPC(pc)
println("ERR", f.String(), file+":"+strconv.FormatInt(int64(line), 10))
}