commander/interceptor/idlecheck/idlecheck.go (53 lines of code) (raw):
package idlecheck
import (
"sync"
"time"
)
const (
minExtendSecond = 5
)
type checker func() bool
var (
extendSecond = minExtendSecond
whenExit time.Time
checkerList map[string]checker
l sync.Mutex
)
func ExtendLive() {
l.Lock()
defer l.Unlock()
when := time.Now().Add(time.Second * time.Duration(extendSecond))
if when.After(whenExit) {
whenExit = when
}
}
func TimeToExit() (time.Time, bool) {
l.Lock()
defer l.Unlock()
for _, f := range checkerList {
if couldExit := f(); !couldExit {
whenExit = time.Now().Add(time.Second * time.Duration(extendSecond))
return whenExit, false
}
}
if time.Now().After(whenExit) {
return whenExit, true
}
return whenExit, false
}
func SetChecker(name string, f checker) {
l.Lock()
defer l.Unlock()
if checkerList == nil {
checkerList = map[string]checker{}
}
checkerList[name] = f
}
func SetExtendSecond(waittime int) {
l.Lock()
defer l.Unlock()
if waittime < minExtendSecond {
waittime = minExtendSecond
}
extendSecond = waittime
}