mirror of https://github.com/v2ray/v2ray-core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
2.6 KiB
144 lines
2.6 KiB
package core
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
|
|
"v2ray.com/core/common"
|
|
"v2ray.com/core/features/inbound"
|
|
"v2ray.com/core/features/outbound"
|
|
)
|
|
|
|
type syncInboundHandlerManager struct {
|
|
sync.RWMutex
|
|
inbound.Manager
|
|
}
|
|
|
|
func (*syncInboundHandlerManager) Type() interface{} {
|
|
return inbound.ManagerType()
|
|
}
|
|
|
|
func (m *syncInboundHandlerManager) GetHandler(ctx context.Context, tag string) (inbound.Handler, error) {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return nil, newError("inbound.Manager not set.").AtError()
|
|
}
|
|
|
|
return m.Manager.GetHandler(ctx, tag)
|
|
}
|
|
|
|
func (m *syncInboundHandlerManager) AddHandler(ctx context.Context, handler inbound.Handler) error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return newError("inbound.Manager not set.").AtError()
|
|
}
|
|
|
|
return m.Manager.AddHandler(ctx, handler)
|
|
}
|
|
|
|
func (m *syncInboundHandlerManager) Start() error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return newError("inbound.Manager not set.").AtError()
|
|
}
|
|
|
|
return m.Manager.Start()
|
|
}
|
|
|
|
func (m *syncInboundHandlerManager) Close() error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
return common.Close(m.Manager)
|
|
}
|
|
|
|
func (m *syncInboundHandlerManager) Set(manager inbound.Manager) {
|
|
if manager == nil {
|
|
return
|
|
}
|
|
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
common.Close(m.Manager) // nolint: errcheck
|
|
m.Manager = manager
|
|
}
|
|
|
|
type syncOutboundHandlerManager struct {
|
|
sync.RWMutex
|
|
outbound.Manager
|
|
}
|
|
|
|
func (*syncOutboundHandlerManager) Type() interface{} {
|
|
return outbound.ManagerType()
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) GetHandler(tag string) outbound.Handler {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return nil
|
|
}
|
|
|
|
return m.Manager.GetHandler(tag)
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) GetDefaultHandler() outbound.Handler {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return nil
|
|
}
|
|
|
|
return m.Manager.GetDefaultHandler()
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) AddHandler(ctx context.Context, handler outbound.Handler) error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return newError("OutboundHandlerManager not set.").AtError()
|
|
}
|
|
|
|
return m.Manager.AddHandler(ctx, handler)
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) Start() error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
if m.Manager == nil {
|
|
return newError("OutboundHandlerManager not set.").AtError()
|
|
}
|
|
|
|
return m.Manager.Start()
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) Close() error {
|
|
m.RLock()
|
|
defer m.RUnlock()
|
|
|
|
return common.Close(m.Manager)
|
|
}
|
|
|
|
func (m *syncOutboundHandlerManager) Set(manager outbound.Manager) {
|
|
if manager == nil {
|
|
return
|
|
}
|
|
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
|
|
common.Close(m.Manager) // nolint: errcheck
|
|
m.Manager = manager
|
|
}
|