router.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package core
  2. import (
  3. "context"
  4. "sync"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/common/vio"
  8. "v2ray.com/core/features/routing"
  9. )
  10. type syncDispatcher struct {
  11. sync.RWMutex
  12. routing.Dispatcher
  13. }
  14. func (d *syncDispatcher) Dispatch(ctx context.Context, dest net.Destination) (*vio.Link, error) {
  15. d.RLock()
  16. defer d.RUnlock()
  17. if d.Dispatcher == nil {
  18. return nil, newError("Dispatcher not set.").AtError()
  19. }
  20. return d.Dispatcher.Dispatch(ctx, dest)
  21. }
  22. func (d *syncDispatcher) Start() error {
  23. d.RLock()
  24. defer d.RUnlock()
  25. if d.Dispatcher == nil {
  26. return newError("Dispatcher not set.").AtError()
  27. }
  28. return d.Dispatcher.Start()
  29. }
  30. func (d *syncDispatcher) Close() error {
  31. d.RLock()
  32. defer d.RUnlock()
  33. return common.Close(d.Dispatcher)
  34. }
  35. func (d *syncDispatcher) Set(disp routing.Dispatcher) {
  36. if disp == nil {
  37. return
  38. }
  39. d.Lock()
  40. defer d.Unlock()
  41. common.Close(d.Dispatcher) // nolint: errorcheck
  42. d.Dispatcher = disp
  43. }
  44. type syncRouter struct {
  45. sync.RWMutex
  46. routing.Router
  47. }
  48. func (r *syncRouter) PickRoute(ctx context.Context) (string, error) {
  49. r.RLock()
  50. defer r.RUnlock()
  51. if r.Router == nil {
  52. return "", common.ErrNoClue
  53. }
  54. return r.Router.PickRoute(ctx)
  55. }
  56. func (r *syncRouter) Start() error {
  57. r.RLock()
  58. defer r.RUnlock()
  59. if r.Router == nil {
  60. return nil
  61. }
  62. return r.Router.Start()
  63. }
  64. func (r *syncRouter) Close() error {
  65. r.RLock()
  66. defer r.RUnlock()
  67. return common.Close(r.Router)
  68. }
  69. func (r *syncRouter) Set(router routing.Router) {
  70. if router == nil {
  71. return
  72. }
  73. r.Lock()
  74. defer r.Unlock()
  75. common.Close(r.Router) // nolint: errcheck
  76. r.Router = router
  77. }