Chore: make set operation atomic

This commit is contained in:
xjasonlyu
2021-03-13 11:50:14 +08:00
parent f41b844e43
commit 094199656b
2 changed files with 17 additions and 9 deletions

View File

@@ -8,6 +8,8 @@ import (
M "github.com/xjasonlyu/tun2socks/constant"
"github.com/xjasonlyu/tun2socks/proxy/proto"
"go.uber.org/atomic"
)
const (
@@ -15,7 +17,7 @@ const (
)
var (
_defaultDialer Dialer = &Base{}
_defaultDialer atomic.Value
)
type Dialer interface {
@@ -29,24 +31,28 @@ type Proxy interface {
Proto() proto.Proto
}
func init() {
_defaultDialer.Store(&Base{})
}
// SetDialer sets default Dialer.
func SetDialer(d Dialer) {
_defaultDialer = d
_defaultDialer.Store(d)
}
// Dial uses default Dialer to dial TCP.
func Dial(metadata *M.Metadata) (net.Conn, error) {
ctx, cancel := context.WithTimeout(context.Background(), tcpConnectTimeout)
defer cancel()
return _defaultDialer.DialContext(ctx, metadata)
return _defaultDialer.Load().(Dialer).DialContext(ctx, metadata)
}
// DialContext uses default Dialer to dial TCP with context.
func DialContext(ctx context.Context, metadata *M.Metadata) (net.Conn, error) {
return _defaultDialer.DialContext(ctx, metadata)
return _defaultDialer.Load().(Dialer).DialContext(ctx, metadata)
}
// DialUDP uses default Dialer to dial UDP.
func DialUDP(metadata *M.Metadata) (net.PacketConn, error) {
return _defaultDialer.DialUDP(metadata)
return _defaultDialer.Load().(Dialer).DialUDP(metadata)
}