track.go 841 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package conntrack
  2. import (
  3. "io"
  4. "sync"
  5. "github.com/sagernet/sing/common"
  6. "github.com/sagernet/sing/common/x/list"
  7. )
  8. var (
  9. connAccess sync.RWMutex
  10. openConnection list.List[io.Closer]
  11. )
  12. func Count() int {
  13. if !Enabled {
  14. return 0
  15. }
  16. return openConnection.Len()
  17. }
  18. func List() []io.Closer {
  19. if !Enabled {
  20. return nil
  21. }
  22. connAccess.RLock()
  23. defer connAccess.RUnlock()
  24. connList := make([]io.Closer, 0, openConnection.Len())
  25. for element := openConnection.Front(); element != nil; element = element.Next() {
  26. connList = append(connList, element.Value)
  27. }
  28. return connList
  29. }
  30. func Close() {
  31. if !Enabled {
  32. return
  33. }
  34. connAccess.Lock()
  35. defer connAccess.Unlock()
  36. for element := openConnection.Front(); element != nil; element = element.Next() {
  37. common.Close(element.Value)
  38. element.Value = nil
  39. }
  40. openConnection.Init()
  41. }