killer.go 595 B

1234567891011121314151617181920212223242526272829303132333435
  1. package conntrack
  2. import (
  3. runtimeDebug "runtime/debug"
  4. "time"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. "github.com/sagernet/sing/common/memory"
  7. )
  8. var (
  9. KillerEnabled bool
  10. MemoryLimit uint64
  11. killerLastCheck time.Time
  12. )
  13. func KillerCheck() error {
  14. if !KillerEnabled {
  15. return nil
  16. }
  17. nowTime := time.Now()
  18. if nowTime.Sub(killerLastCheck) < 3*time.Second {
  19. return nil
  20. }
  21. killerLastCheck = nowTime
  22. if memory.Total() > MemoryLimit {
  23. Close()
  24. go func() {
  25. time.Sleep(time.Second)
  26. runtimeDebug.FreeOSMemory()
  27. }()
  28. return E.New("out of memory")
  29. }
  30. return nil
  31. }