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  }