52 lines
1.5 KiB
Go
52 lines
1.5 KiB
Go
package oomkiller
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/sagernet/sing-box/option"
|
|
E "github.com/sagernet/sing/common/exceptions"
|
|
)
|
|
|
|
func buildTimerConfig(options option.OOMKillerServiceOptions, memoryLimit uint64, useAvailable bool) (timerConfig, error) {
|
|
safetyMargin := uint64(defaultSafetyMargin)
|
|
if options.SafetyMargin != nil && options.SafetyMargin.Value() > 0 {
|
|
safetyMargin = options.SafetyMargin.Value()
|
|
}
|
|
|
|
minInterval := defaultMinInterval
|
|
if options.MinInterval != 0 {
|
|
minInterval = time.Duration(options.MinInterval.Build())
|
|
if minInterval <= 0 {
|
|
return timerConfig{}, E.New("min_interval must be greater than 0")
|
|
}
|
|
}
|
|
|
|
maxInterval := defaultMaxInterval
|
|
if options.MaxInterval != 0 {
|
|
maxInterval = time.Duration(options.MaxInterval.Build())
|
|
if maxInterval <= 0 {
|
|
return timerConfig{}, E.New("max_interval must be greater than 0")
|
|
}
|
|
}
|
|
if maxInterval < minInterval {
|
|
return timerConfig{}, E.New("max_interval must be greater than or equal to min_interval")
|
|
}
|
|
|
|
checksBeforeLimit := defaultChecksBeforeLimit
|
|
if options.ChecksBeforeLimit != 0 {
|
|
checksBeforeLimit = options.ChecksBeforeLimit
|
|
if checksBeforeLimit <= 0 {
|
|
return timerConfig{}, E.New("checks_before_limit must be greater than 0")
|
|
}
|
|
}
|
|
|
|
return timerConfig{
|
|
memoryLimit: memoryLimit,
|
|
safetyMargin: safetyMargin,
|
|
minInterval: minInterval,
|
|
maxInterval: maxInterval,
|
|
checksBeforeLimit: checksBeforeLimit,
|
|
useAvailable: useAvailable,
|
|
}, nil
|
|
}
|