| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- package core
- import (
- "context"
- "sync"
- "v2ray.com/core/common"
- "v2ray.com/core/common/net"
- "v2ray.com/core/common/vio"
- "v2ray.com/core/features/routing"
- )
- type syncDispatcher struct {
- sync.RWMutex
- routing.Dispatcher
- }
- func (*syncDispatcher) Type() interface{} {
- return routing.DispatcherType()
- }
- func (d *syncDispatcher) Dispatch(ctx context.Context, dest net.Destination) (*vio.Link, error) {
- d.RLock()
- defer d.RUnlock()
- if d.Dispatcher == nil {
- return nil, newError("Dispatcher not set.").AtError()
- }
- return d.Dispatcher.Dispatch(ctx, dest)
- }
- func (d *syncDispatcher) Start() error {
- d.RLock()
- defer d.RUnlock()
- if d.Dispatcher == nil {
- return newError("Dispatcher not set.").AtError()
- }
- return d.Dispatcher.Start()
- }
- func (d *syncDispatcher) Close() error {
- d.RLock()
- defer d.RUnlock()
- return common.Close(d.Dispatcher)
- }
- func (d *syncDispatcher) Set(disp routing.Dispatcher) {
- if disp == nil {
- return
- }
- d.Lock()
- defer d.Unlock()
- common.Close(d.Dispatcher) // nolint: errcheck
- d.Dispatcher = disp
- }
- type syncRouter struct {
- sync.RWMutex
- routing.Router
- }
- func (*syncRouter) Type() interface{} {
- return routing.RouterType()
- }
- func (r *syncRouter) PickRoute(ctx context.Context) (string, error) {
- r.RLock()
- defer r.RUnlock()
- if r.Router == nil {
- return "", common.ErrNoClue
- }
- return r.Router.PickRoute(ctx)
- }
- func (r *syncRouter) Start() error {
- r.RLock()
- defer r.RUnlock()
- if r.Router == nil {
- return nil
- }
- return r.Router.Start()
- }
- func (r *syncRouter) Close() error {
- r.RLock()
- defer r.RUnlock()
- return common.Close(r.Router)
- }
- func (r *syncRouter) Set(router routing.Router) {
- if router == nil {
- return
- }
- r.Lock()
- defer r.Unlock()
- common.Close(r.Router) // nolint: errcheck
- r.Router = router
- }
|