aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/syndtr
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2017-01-11 02:33:17 +0800
committerFelix Lange <fjl@twurst.com>2017-01-11 05:33:24 +0800
commitd78f9b834ade0f1ebcf2532bf90d01c85ad50a8e (patch)
treedd03906433e1032a0b185910773206246d8a1556 /vendor/github.com/syndtr
parent02b67558e8eaa7b34a28b8dd0223824bbbb52349 (diff)
downloadgo-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar.gz
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar.bz2
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar.lz
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar.xz
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.tar.zst
go-tangerine-d78f9b834ade0f1ebcf2532bf90d01c85ad50a8e.zip
vendor: update all dependencies except Azure SDK
The Azure SDK doesn't support Go 1.5 anymore. We can't upgrade it until Go 1.8 comes out.
Diffstat (limited to 'vendor/github.com/syndtr')
-rw-r--r--vendor/github.com/syndtr/goleveldb/leveldb/session.go2
-rw-r--r--vendor/github.com/syndtr/goleveldb/leveldb/session_util.go27
-rw-r--r--vendor/github.com/syndtr/goleveldb/leveldb/version.go40
3 files changed, 44 insertions, 25 deletions
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go
index f3e747701..ad68a8703 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/session.go
@@ -47,6 +47,7 @@ type session struct {
o *cachedOptions
icmp *iComparer
tops *tOps
+ fileRef map[int64]int
manifest *journal.Writer
manifestWriter storage.Writer
@@ -69,6 +70,7 @@ func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) {
s = &session{
stor: stor,
storLock: storLock,
+ fileRef: make(map[int64]int),
}
s.setOptions(o)
s.tops = newTableOps(s)
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go
index 34ad61798..92328933c 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/session_util.go
@@ -39,6 +39,18 @@ func (s *session) newTemp() storage.FileDesc {
return storage.FileDesc{storage.TypeTemp, num}
}
+func (s *session) addFileRef(fd storage.FileDesc, ref int) int {
+ ref += s.fileRef[fd.Num]
+ if ref > 0 {
+ s.fileRef[fd.Num] = ref
+ } else if ref == 0 {
+ delete(s.fileRef, fd.Num)
+ } else {
+ panic(fmt.Sprintf("negative ref: %v", fd))
+ }
+ return ref
+}
+
// Session state.
// Get current version. This will incr version ref, must call
@@ -46,7 +58,7 @@ func (s *session) newTemp() storage.FileDesc {
func (s *session) version() *version {
s.vmu.Lock()
defer s.vmu.Unlock()
- s.stVersion.ref++
+ s.stVersion.incref()
return s.stVersion
}
@@ -59,14 +71,15 @@ func (s *session) tLen(level int) int {
// Set current version to v.
func (s *session) setVersion(v *version) {
s.vmu.Lock()
- v.ref = 1 // Holds by session.
- if old := s.stVersion; old != nil {
- v.ref++ // Holds by old version.
- old.next = v
- old.releaseNB()
+ defer s.vmu.Unlock()
+ // Hold by session. It is important to call this first before releasing
+ // current version, otherwise the still used files might get released.
+ v.incref()
+ if s.stVersion != nil {
+ // Release current version.
+ s.stVersion.releaseNB()
}
s.stVersion = v
- s.vmu.Unlock()
}
// Get current unused file number.
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go
index c60f12c20..73f272af5 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/version.go
@@ -34,44 +34,48 @@ type version struct {
cSeek unsafe.Pointer
- closing bool
- ref int
- // Succeeding version.
- next *version
+ closing bool
+ ref int
+ released bool
}
func newVersion(s *session) *version {
return &version{s: s}
}
+func (v *version) incref() {
+ if v.released {
+ panic("already released")
+ }
+
+ v.ref++
+ if v.ref == 1 {
+ // Incr file ref.
+ for _, tt := range v.levels {
+ for _, t := range tt {
+ v.s.addFileRef(t.fd, 1)
+ }
+ }
+ }
+}
+
func (v *version) releaseNB() {
v.ref--
if v.ref > 0 {
return
- }
- if v.ref < 0 {
+ } else if v.ref < 0 {
panic("negative version ref")
}
- nextTables := make(map[int64]bool)
- for _, tt := range v.next.levels {
- for _, t := range tt {
- num := t.fd.Num
- nextTables[num] = true
- }
- }
-
for _, tt := range v.levels {
for _, t := range tt {
- num := t.fd.Num
- if _, ok := nextTables[num]; !ok {
+ if v.s.addFileRef(t.fd, -1) == 0 {
v.s.tops.remove(t)
}
}
}
- v.next.releaseNB()
- v.next = nil
+ v.released = true
}
func (v *version) release() {