]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: make Register safe for concurrent use
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Jun 2015 00:56:20 +0000 (17:56 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 30 Jun 2015 23:15:03 +0000 (23:15 +0000)
Adding a mutex was easier than documenting it, and is consistent with
gob.

Fixes #9847

Change-Id: Ifa94c17e7c11643add81b35431ef840b794d78b1
Reviewed-on: https://go-review.googlesource.com/11682
Reviewed-by: Andrew Gerrand <adg@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/database/sql/sql.go

index 96c93ed1c699484351936b3a98974bee65dd1e4a..aeb5c0e382c14fd426444e6bee48bd434fda0959 100644 (file)
@@ -23,12 +23,17 @@ import (
        "sync/atomic"
 )
 
-var drivers = make(map[string]driver.Driver)
+var (
+       driversMu sync.Mutex
+       drivers   = make(map[string]driver.Driver)
+)
 
 // Register makes a database driver available by the provided name.
 // If Register is called twice with the same name or if driver is nil,
 // it panics.
 func Register(name string, driver driver.Driver) {
+       driversMu.Lock()
+       defer driversMu.Unlock()
        if driver == nil {
                panic("sql: Register driver is nil")
        }
@@ -39,12 +44,16 @@ func Register(name string, driver driver.Driver) {
 }
 
 func unregisterAllDrivers() {
+       driversMu.Lock()
+       defer driversMu.Unlock()
        // For tests.
        drivers = make(map[string]driver.Driver)
 }
 
 // Drivers returns a sorted list of the names of the registered drivers.
 func Drivers() []string {
+       driversMu.Lock()
+       defer driversMu.Unlock()
        var list []string
        for name := range drivers {
                list = append(list, name)
@@ -457,7 +466,9 @@ var connectionRequestQueueSize = 1000000
 // function should be called just once. It is rarely necessary to
 // close a DB.
 func Open(driverName, dataSourceName string) (*DB, error) {
+       driversMu.Lock()
        driveri, ok := drivers[driverName]
+       driversMu.Unlock()
        if !ok {
                return nil, fmt.Errorf("sql: unknown driver %q (forgotten import?)", driverName)
        }