mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-10-20 08:14:24 +00:00
Close idle connections of unreferenced outbounds and DNS servers
This commit is contained in:
@@ -25,6 +25,7 @@ func RegisterSelector(registry *outbound.Registry) {
|
||||
|
||||
var (
|
||||
_ adapter.OutboundGroup = (*Selector)(nil)
|
||||
_ adapter.Referrer = (*Selector)(nil)
|
||||
_ adapter.ConnectionHandler = (*Selector)(nil)
|
||||
_ adapter.PacketConnectionHandler = (*Selector)(nil)
|
||||
)
|
||||
@@ -120,6 +121,10 @@ func (s *Selector) All() []string {
|
||||
return s.tags
|
||||
}
|
||||
|
||||
func (s *Selector) References() []string {
|
||||
return []string{s.Now()}
|
||||
}
|
||||
|
||||
func (s *Selector) SelectOutbound(tag string) bool {
|
||||
detour, loaded := s.outbounds[tag]
|
||||
if !loaded {
|
||||
|
||||
@@ -32,6 +32,7 @@ func RegisterURLTest(registry *outbound.Registry) {
|
||||
var (
|
||||
_ adapter.OutboundGroup = (*URLTest)(nil)
|
||||
_ adapter.InterfaceUpdateListener = (*URLTest)(nil)
|
||||
_ adapter.Referrer = (*URLTest)(nil)
|
||||
)
|
||||
|
||||
type URLTest struct {
|
||||
@@ -111,6 +112,21 @@ func (s *URLTest) All() []string {
|
||||
return s.tags
|
||||
}
|
||||
|
||||
func (s *URLTest) References() []string {
|
||||
group := s.group
|
||||
if group == nil {
|
||||
return nil
|
||||
}
|
||||
var references []string
|
||||
if group.selectedOutboundTCP != nil {
|
||||
references = append(references, group.selectedOutboundTCP.Tag())
|
||||
}
|
||||
if group.selectedOutboundUDP != nil && group.selectedOutboundUDP != group.selectedOutboundTCP {
|
||||
references = append(references, group.selectedOutboundUDP.Tag())
|
||||
}
|
||||
return references
|
||||
}
|
||||
|
||||
func (s *URLTest) URLTest(ctx context.Context) (map[string]uint16, error) {
|
||||
return s.group.URLTest(ctx)
|
||||
}
|
||||
@@ -488,20 +504,28 @@ func (b *urlTestBatch) test(outbounds []adapter.Outbound, link string, interval
|
||||
func (g *URLTestGroup) performUpdateCheck() {
|
||||
g.updateAccess.Lock()
|
||||
defer g.updateAccess.Unlock()
|
||||
var updated bool
|
||||
var (
|
||||
updated bool
|
||||
selected bool
|
||||
)
|
||||
if outbound, exists := g.Select(N.NetworkTCP); outbound != nil && (g.selectedOutboundTCP == nil || (exists && outbound != g.selectedOutboundTCP)) {
|
||||
if g.selectedOutboundTCP != nil {
|
||||
updated = true
|
||||
}
|
||||
g.selectedOutboundTCP = outbound
|
||||
selected = true
|
||||
}
|
||||
if outbound, exists := g.Select(N.NetworkUDP); outbound != nil && (g.selectedOutboundUDP == nil || (exists && outbound != g.selectedOutboundUDP)) {
|
||||
if g.selectedOutboundUDP != nil {
|
||||
updated = true
|
||||
}
|
||||
g.selectedOutboundUDP = outbound
|
||||
selected = true
|
||||
}
|
||||
if updated {
|
||||
g.interruptGroup.Interrupt(g.interruptExternalConnections)
|
||||
}
|
||||
if selected {
|
||||
g.history.NotifyUpdated()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user