aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2015-06-29 17:56:20 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2015-06-30 23:15:03 +0000
commitfc2eee87edd1ffbe6afd3b742760d29ac3983d3b (patch)
treefba55af5fbe825b91b9d6d5b45cef2251c8a3787
parent300d9a21583e7cf0149a778a0611e76ff7c6680f (diff)
downloadgo-fc2eee87edd1ffbe6afd3b742760d29ac3983d3b.tar.gz
go-fc2eee87edd1ffbe6afd3b742760d29ac3983d3b.zip
database/sql: make Register safe for concurrent use
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>
-rw-r--r--src/database/sql/sql.go13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/database/sql/sql.go b/src/database/sql/sql.go
index 96c93ed1c6..aeb5c0e382 100644
--- a/src/database/sql/sql.go
+++ b/src/database/sql/sql.go
@@ -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)
}