package conntrack

import (
	runtimeDebug "runtime/debug"
	"time"

	E "github.com/sagernet/sing/common/exceptions"
	"github.com/sagernet/sing/common/memory"
)

var (
	KillerEnabled   bool
	MemoryLimit     uint64
	killerLastCheck time.Time
)

func KillerCheck() error {
	if !KillerEnabled {
		return nil
	}
	nowTime := time.Now()
	if nowTime.Sub(killerLastCheck) < 3*time.Second {
		return nil
	}
	killerLastCheck = nowTime
	if memory.Total() > MemoryLimit {
		Close()
		go func() {
			time.Sleep(time.Second)
			runtimeDebug.FreeOSMemory()
		}()
		return E.New("out of memory")
	}
	return nil
}