@@ -14,17 +14,15 @@ import (
1414 "net"
1515 "strconv"
1616 "strings"
17- "sync"
18- "sync/atomic"
1917 "time"
2018)
2119
22- // a copy of context.Context for Go 1.7 and later.
20+ // a copy of context.Context for Go 1.7 and earlier
2321type mysqlContext interface {
2422 Done () <- chan struct {}
2523 Err () error
2624
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:
2826 // Deadline() (deadline time.Time, ok bool)
2927 // Value(key interface{}) interface{}
3028}
@@ -44,18 +42,13 @@ type mysqlConn struct {
4442 parseTime bool
4543 strict bool
4644
47- // for context support (From Go 1.8)
45+ // for context support (Go 1.8+ )
4846 watching bool
4947 watcher chan <- mysqlContext
5048 closech chan struct {}
5149 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
5952}
6053
6154// Handles parameters set in DSN after the connection is established
@@ -89,7 +82,7 @@ func (mc *mysqlConn) handleParams() (err error) {
8982}
9083
9184func (mc * mysqlConn ) Begin () (driver.Tx , error ) {
92- if mc .isBroken () {
85+ if mc .closed . IsSet () {
9386 errLog .Print (ErrInvalidConn )
9487 return nil , driver .ErrBadConn
9588 }
@@ -103,7 +96,7 @@ func (mc *mysqlConn) Begin() (driver.Tx, error) {
10396
10497func (mc * mysqlConn ) Close () (err error ) {
10598 // Makes Close idempotent
106- if ! mc .isBroken () {
99+ if ! mc .closed . IsSet () {
107100 err = mc .writeCommandPacket (comQuit )
108101 }
109102
@@ -117,7 +110,7 @@ func (mc *mysqlConn) Close() (err error) {
117110// is called before auth or on auth failure because MySQL will have already
118111// closed the network connection.
119112func (mc * mysqlConn ) cleanup () {
120- if atomic . SwapInt32 ( & mc .closed , 1 ) != 0 {
113+ if ! mc .closed . TrySet ( true ) {
121114 return
122115 }
123116
@@ -131,13 +124,9 @@ func (mc *mysqlConn) cleanup() {
131124 }
132125}
133126
134- func (mc * mysqlConn ) isBroken () bool {
135- return atomic .LoadInt32 (& mc .closed ) != 0
136- }
137-
138127func (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 {
141130 return err
142131 }
143132 return ErrInvalidConn
@@ -146,7 +135,7 @@ func (mc *mysqlConn) error() error {
146135}
147136
148137func (mc * mysqlConn ) Prepare (query string ) (driver.Stmt , error ) {
149- if mc .isBroken () {
138+ if mc .closed . IsSet () {
150139 errLog .Print (ErrInvalidConn )
151140 return nil , driver .ErrBadConn
152141 }
@@ -300,7 +289,7 @@ func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (strin
300289}
301290
302291func (mc * mysqlConn ) Exec (query string , args []driver.Value ) (driver.Result , error ) {
303- if mc .isBroken () {
292+ if mc .closed . IsSet () {
304293 errLog .Print (ErrInvalidConn )
305294 return nil , driver .ErrBadConn
306295 }
@@ -361,7 +350,7 @@ func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, erro
361350}
362351
363352func (mc * mysqlConn ) query (query string , args []driver.Value ) (* textRows , error ) {
364- if mc .isBroken () {
353+ if mc .closed . IsSet () {
365354 errLog .Print (ErrInvalidConn )
366355 return nil , driver .ErrBadConn
367356 }
@@ -436,19 +425,10 @@ func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) {
436425
437426// finish is called when the query has canceled.
438427func (mc * mysqlConn ) cancel (err error ) {
439- mc .mu .Lock ()
440- mc .canceledErr = err
441- mc .mu .Unlock ()
428+ mc .canceled .Set (err )
442429 mc .cleanup ()
443430}
444431
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-
452432// finish is called when the query has succeeded.
453433func (mc * mysqlConn ) finish () {
454434 if ! mc .watching || mc .finished == nil {
0 commit comments