github.com/whatap/golib@v0.0.22/util/panicutil/safefor.go (about) 1 package panicutil 2 3 import ( 4 "sync" 5 "time" 6 ) 7 8 var onofflookup map[string]bool 9 var AllOff bool = false 10 var OffSleepTime int32 = 10 11 var PerfMap map[string]int32 = map[string]int32{} 12 var SendPerfMapEnabled bool = false 13 var perfMapLock = sync.Mutex{} 14 15 //ResetPerfMap ResetPerfMap 16 func ResetPerfMap() map[string]int32 { 17 perfMapLock.Lock() 18 m := PerfMap 19 20 PerfMap = map[string]int32{} 21 perfMapLock.Unlock() 22 return m 23 24 } 25 26 //SafeFor SafeFor 27 func SafeFor(name string, callback func()) { 28 for { 29 start := time.Now() 30 31 if AllOff { 32 time.Sleep(time.Duration(OffSleepTime) * time.Millisecond) 33 return 34 } 35 if on, ok := onofflookup[name]; ok { 36 if !on { 37 time.Sleep(time.Duration(OffSleepTime) * time.Millisecond) 38 } else { 39 callback() 40 perfMapLock.Lock() 41 PerfMap[name] = int32(time.Since(start).Nanoseconds() / 1000) 42 perfMapLock.Unlock() 43 } 44 } else { 45 callback() 46 perfMapLock.Lock() 47 PerfMap[name] = int32(time.Since(start).Nanoseconds() / 1000) 48 perfMapLock.Unlock() 49 } 50 time.Sleep(time.Duration(OffSleepTime) * time.Millisecond) 51 } 52 } 53 54 func Safe(name string, callback func()) { 55 start := time.Now() 56 defer func() { 57 perfMapLock.Lock() 58 PerfMap[name] = int32(time.Since(start).Nanoseconds() / 1000) 59 perfMapLock.Unlock() 60 }() 61 62 // fmt.Println("Safe step -1") 63 if AllOff { 64 // fmt.Println("Safe step -2") 65 time.Sleep(time.Duration(OffSleepTime) * time.Millisecond) 66 return 67 } 68 // fmt.Println("Safe step -3") 69 if on, ok := onofflookup[name]; ok { 70 // fmt.Println("Safe step -4") 71 if !on { 72 // fmt.Println("Safe step -5") 73 time.Sleep(time.Duration(OffSleepTime) * time.Millisecond) 74 } else { 75 // fmt.Println("Safe step -6") 76 callback() 77 } 78 } else { 79 // fmt.Println("Safe step -7") 80 callback() 81 } 82 // fmt.Println("Safe step -8") 83 } 84 85 func SetLoopOffMap(m *map[string]bool) { 86 onofflookup = *m 87 // val, ok := onofflookup["countermanager.poll"] 88 // fmt.Println("SetLoopOffMap val:", val, "ok:", ok, "size:", len(onofflookup)) 89 } 90 func SetOnOff(name string, onoff bool) { 91 onofflookup[name] = onoff 92 }