|
@@ -22,14 +22,14 @@ type Manager struct {
|
|
|
taggedHandler map[string]outbound.Handler
|
|
taggedHandler map[string]outbound.Handler
|
|
|
untaggedHandlers []outbound.Handler
|
|
untaggedHandlers []outbound.Handler
|
|
|
running bool
|
|
running bool
|
|
|
- tagsCache map[string][]string
|
|
|
|
|
|
|
+ tagsCache *sync.Map
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// New creates a new Manager.
|
|
// New creates a new Manager.
|
|
|
func New(ctx context.Context, config *proxyman.OutboundConfig) (*Manager, error) {
|
|
func New(ctx context.Context, config *proxyman.OutboundConfig) (*Manager, error) {
|
|
|
m := &Manager{
|
|
m := &Manager{
|
|
|
taggedHandler: make(map[string]outbound.Handler),
|
|
taggedHandler: make(map[string]outbound.Handler),
|
|
|
- tagsCache: make(map[string][]string),
|
|
|
|
|
|
|
+ tagsCache: &sync.Map{},
|
|
|
}
|
|
}
|
|
|
return m, nil
|
|
return m, nil
|
|
|
}
|
|
}
|
|
@@ -106,7 +106,7 @@ func (m *Manager) AddHandler(ctx context.Context, handler outbound.Handler) erro
|
|
|
m.access.Lock()
|
|
m.access.Lock()
|
|
|
defer m.access.Unlock()
|
|
defer m.access.Unlock()
|
|
|
|
|
|
|
|
- m.tagsCache = make(map[string][]string)
|
|
|
|
|
|
|
+ m.tagsCache = &sync.Map{}
|
|
|
|
|
|
|
|
if m.defaultHandler == nil {
|
|
if m.defaultHandler == nil {
|
|
|
m.defaultHandler = handler
|
|
m.defaultHandler = handler
|
|
@@ -137,7 +137,7 @@ func (m *Manager) RemoveHandler(ctx context.Context, tag string) error {
|
|
|
m.access.Lock()
|
|
m.access.Lock()
|
|
|
defer m.access.Unlock()
|
|
defer m.access.Unlock()
|
|
|
|
|
|
|
|
- m.tagsCache = make(map[string][]string)
|
|
|
|
|
|
|
+ m.tagsCache = &sync.Map{}
|
|
|
|
|
|
|
|
delete(m.taggedHandler, tag)
|
|
delete(m.taggedHandler, tag)
|
|
|
if m.defaultHandler != nil && m.defaultHandler.Tag() == tag {
|
|
if m.defaultHandler != nil && m.defaultHandler.Tag() == tag {
|
|
@@ -149,14 +149,15 @@ func (m *Manager) RemoveHandler(ctx context.Context, tag string) error {
|
|
|
|
|
|
|
|
// Select implements outbound.HandlerSelector.
|
|
// Select implements outbound.HandlerSelector.
|
|
|
func (m *Manager) Select(selectors []string) []string {
|
|
func (m *Manager) Select(selectors []string) []string {
|
|
|
- m.access.RLock()
|
|
|
|
|
- defer m.access.RUnlock()
|
|
|
|
|
|
|
|
|
|
key := strings.Join(selectors, ",")
|
|
key := strings.Join(selectors, ",")
|
|
|
- if cache, ok := m.tagsCache[key]; ok {
|
|
|
|
|
- return cache
|
|
|
|
|
|
|
+ if cache, ok := m.tagsCache.Load(key); ok {
|
|
|
|
|
+ return cache.([]string)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ m.access.RLock()
|
|
|
|
|
+ defer m.access.RUnlock()
|
|
|
|
|
+
|
|
|
tags := make([]string, 0, len(selectors))
|
|
tags := make([]string, 0, len(selectors))
|
|
|
|
|
|
|
|
for tag := range m.taggedHandler {
|
|
for tag := range m.taggedHandler {
|
|
@@ -169,7 +170,7 @@ func (m *Manager) Select(selectors []string) []string {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
sort.Strings(tags)
|
|
sort.Strings(tags)
|
|
|
- m.tagsCache[key] = tags
|
|
|
|
|
|
|
+ m.tagsCache.Store(key, tags)
|
|
|
|
|
|
|
|
return tags
|
|
return tags
|
|
|
}
|
|
}
|