diff options
| author | Brad Fitzpatrick <bradfitz@golang.org> | 2013-05-21 14:58:08 -0700 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2013-05-21 14:58:08 -0700 |
| commit | 0e10196982e81be38c46b77572837ccf90cb3366 (patch) | |
| tree | 5015dd9d9c5610744857c1f18bdebeb07d648d0f /src/pkg/database/sql/sql.go | |
| parent | 509a1173a33d4fd914409cd941470d440fd5eed3 (diff) | |
| download | go-0e10196982e81be38c46b77572837ccf90cb3366.tar.xz | |
database/sql: remove extra RemoveDep call
This should have been removed in 45c12efb4635. Not a correctness
issue, but unnecessary work.
This CL also adds paranoia checks in removeDep so this doesn't
happen again.
Fixes #5502
R=adg
CC=gobot, golang-dev, google
https://golang.org/cl/9543043
Diffstat (limited to 'src/pkg/database/sql/sql.go')
| -rw-r--r-- | src/pkg/database/sql/sql.go | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/src/pkg/database/sql/sql.go b/src/pkg/database/sql/sql.go index 968cb74752..ebb7f440e0 100644 --- a/src/pkg/database/sql/sql.go +++ b/src/pkg/database/sql/sql.go @@ -357,21 +357,27 @@ func (db *DB) removeDep(x finalCloser, dep interface{}) error { func (db *DB) removeDepLocked(x finalCloser, dep interface{}) func() error { //println(fmt.Sprintf("removeDep(%T %p, %T %p)", x, x, dep, dep)) - done := false - xdep := db.dep[x] - if xdep != nil { - delete(xdep, dep) - if len(xdep) == 0 { - delete(db.dep, x) - done = true - } + xdep, ok := db.dep[x] + if !ok { + panic(fmt.Sprintf("unpaired removeDep: no deps for %T", x)) } - if !done { + l0 := len(xdep) + delete(xdep, dep) + + switch len(xdep) { + case l0: + // Nothing removed. Shouldn't happen. + panic(fmt.Sprintf("unpaired removeDep: no %T dep on %T", dep, x)) + case 0: + // No more dependencies. + delete(db.dep, x) + return x.finalClose + default: + // Dependencies remain. return func() error { return nil } } - return x.finalClose } // Open opens a database specified by its database driver name and a @@ -1261,7 +1267,6 @@ func (s *Stmt) finalClose() error { for _, v := range s.css { s.db.noteUnusedDriverStatement(v.dc, v.si) v.dc.removeOpenStmt(v.si) - s.db.removeDep(v.dc, s) } s.css = nil return nil |
