@@ -14,17 +14,15 @@ import (
14
14
"net"
15
15
"strconv"
16
16
"strings"
17
- "sync"
18
- "sync/atomic"
19
17
"time"
20
18
)
21
19
22
- // a copy of context.Context for Go 1.7 and later.
20
+ // a copy of context.Context for Go 1.7 and earlier
23
21
type mysqlContext interface {
24
22
Done () <- chan struct {}
25
23
Err () error
26
24
27
- // They are defined in context.Context, but go-mysql-driver does not use them.
25
+ // defined in context.Context, but not used in this driver:
28
26
// Deadline() (deadline time.Time, ok bool)
29
27
// Value(key interface{}) interface{}
30
28
}
@@ -44,18 +42,13 @@ type mysqlConn struct {
44
42
parseTime bool
45
43
strict bool
46
44
47
- // for context support (From Go 1.8)
45
+ // for context support (Go 1.8+ )
48
46
watching bool
49
47
watcher chan <- mysqlContext
50
48
closech chan struct {}
51
49
finished chan <- struct {}
52
-
53
- // set non-zero when conn is closed, before closech is closed.
54
- // accessed atomically.
55
- closed int32
56
-
57
- mu sync.Mutex // guards following fields
58
- canceledErr error // set non-nil if conn is canceled
50
+ canceled atomicError // set non-nil if conn is canceled
51
+ closed atomicBool // set when conn is closed, before closech is closed
59
52
}
60
53
61
54
// Handles parameters set in DSN after the connection is established
@@ -89,7 +82,7 @@ func (mc *mysqlConn) handleParams() (err error) {
89
82
}
90
83
91
84
func (mc * mysqlConn ) Begin () (driver.Tx , error ) {
92
- if mc .isBroken () {
85
+ if mc .closed . IsSet () {
93
86
errLog .Print (ErrInvalidConn )
94
87
return nil , driver .ErrBadConn
95
88
}
@@ -103,7 +96,7 @@ func (mc *mysqlConn) Begin() (driver.Tx, error) {
103
96
104
97
func (mc * mysqlConn ) Close () (err error ) {
105
98
// Makes Close idempotent
106
- if ! mc .isBroken () {
99
+ if ! mc .closed . IsSet () {
107
100
err = mc .writeCommandPacket (comQuit )
108
101
}
109
102
@@ -117,7 +110,7 @@ func (mc *mysqlConn) Close() (err error) {
117
110
// is called before auth or on auth failure because MySQL will have already
118
111
// closed the network connection.
119
112
func (mc * mysqlConn ) cleanup () {
120
- if atomic . SwapInt32 ( & mc .closed , 1 ) != 0 {
113
+ if ! mc .closed . TrySet ( true ) {
121
114
return
122
115
}
123
116
@@ -131,13 +124,9 @@ func (mc *mysqlConn) cleanup() {
131
124
}
132
125
}
133
126
134
- func (mc * mysqlConn ) isBroken () bool {
135
- return atomic .LoadInt32 (& mc .closed ) != 0
136
- }
137
-
138
127
func (mc * mysqlConn ) error () error {
139
- if mc .isBroken () {
140
- if err := mc .canceled (); err != nil {
128
+ if mc .closed . IsSet () {
129
+ if err := mc .canceled . Value (); err != nil {
141
130
return err
142
131
}
143
132
return ErrInvalidConn
@@ -146,7 +135,7 @@ func (mc *mysqlConn) error() error {
146
135
}
147
136
148
137
func (mc * mysqlConn ) Prepare (query string ) (driver.Stmt , error ) {
149
- if mc .isBroken () {
138
+ if mc .closed . IsSet () {
150
139
errLog .Print (ErrInvalidConn )
151
140
return nil , driver .ErrBadConn
152
141
}
@@ -300,7 +289,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
300
289
}
301
290
302
291
func (mc * mysqlConn ) Exec (query string , args []driver.Value ) (driver.Result , error ) {
303
- if mc .isBroken () {
292
+ if mc .closed . IsSet () {
304
293
errLog .Print (ErrInvalidConn )
305
294
return nil , driver .ErrBadConn
306
295
}
@@ -361,7 +350,7 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
361
350
}
362
351
363
352
func (mc * mysqlConn ) query (query string , args []driver.Value ) (* textRows , error ) {
364
- if mc .isBroken () {
353
+ if mc .closed . IsSet () {
365
354
errLog .Print (ErrInvalidConn )
366
355
return nil , driver .ErrBadConn
367
356
}
@@ -436,19 +425,10 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
436
425
437
426
// finish is called when the query has canceled.
438
427
func (mc * mysqlConn ) cancel (err error ) {
439
- mc .mu .Lock ()
440
- mc .canceledErr = err
441
- mc .mu .Unlock ()
428
+ mc .canceled .Set (err )
442
429
mc .cleanup ()
443
430
}
444
431
445
- // canceled returns non-nil if the connection was closed due to context cancelation.
446
- func (mc * mysqlConn ) canceled () error {
447
- mc .mu .Lock ()
448
- defer mc .mu .Unlock ()
449
- return mc .canceledErr
450
- }
451
-
452
432
// finish is called when the query has succeeded.
453
433
func (mc * mysqlConn ) finish () {
454
434
if ! mc .watching || mc .finished == nil {
0 commit comments