@@ -48,6 +48,7 @@ type connection struct {
48
48
config * connectionConfig
49
49
cancelConnectContext context.CancelFunc
50
50
connectContextMade chan struct {}
51
+ connectContextMutex sync.Mutex
51
52
52
53
// pool related fields
53
54
pool * pool
@@ -105,7 +106,23 @@ func (c *connection) connect(ctx context.Context) {
105
106
}
106
107
defer close (c .connectDone )
107
108
109
+ c .connectContextMutex .Lock ()
108
110
ctx , c .cancelConnectContext = context .WithCancel (ctx )
111
+ c .connectContextMutex .Unlock ()
112
+
113
+ defer func () {
114
+ var cancelFn context.CancelFunc
115
+
116
+ c .connectContextMutex .Lock ()
117
+ cancelFn = c .cancelConnectContext
118
+ c .cancelConnectContext = nil
119
+ c .connectContextMutex .Unlock ()
120
+
121
+ if cancelFn != nil {
122
+ cancelFn ()
123
+ }
124
+ }()
125
+
109
126
close (c .connectContextMade )
110
127
111
128
// Assign the result of DialContext to a temporary net.Conn to ensure that c.nc is not set in an error case.
@@ -188,7 +205,16 @@ func (c *connection) wait() error {
188
205
189
206
func (c * connection ) closeConnectContext () {
190
207
<- c .connectContextMade
191
- c .cancelConnectContext ()
208
+ var cancelFn context.CancelFunc
209
+
210
+ c .connectContextMutex .Lock ()
211
+ cancelFn = c .cancelConnectContext
212
+ c .cancelConnectContext = nil
213
+ c .connectContextMutex .Unlock ()
214
+
215
+ if cancelFn != nil {
216
+ cancelFn ()
217
+ }
192
218
}
193
219
194
220
func (c * connection ) writeWireMessage (ctx context.Context , wm []byte ) error {
0 commit comments