1 // Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com> 2 // All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 7 // Package util provides utilities used throughout leveldb. 8 package util 9 10 import ( 11 "errors" 12 ) 13 14 var ( 15 ErrReleased = errors.New("leveldb: resource already relesed") 16 ErrHasReleaser = errors.New("leveldb: releaser already defined") 17 ) 18 19 // Releaser is the interface that wraps the basic Release method. 20 type Releaser interface { 21 // Release releases associated resources. Release should always success 22 // and can be called multiple times without causing error. 23 Release() 24 } 25 26 // ReleaseSetter is the interface that wraps the basic SetReleaser method. 27 type ReleaseSetter interface { 28 // SetReleaser associates the given releaser to the resources. The 29 // releaser will be called once coresponding resources released. 30 // Calling SetReleaser with nil will clear the releaser. 31 // 32 // This will panic if a releaser already present or coresponding 33 // resource is already released. Releaser should be cleared first 34 // before assigned a new one. 35 SetReleaser(releaser Releaser) 36 } 37 38 // BasicReleaser provides basic implementation of Releaser and ReleaseSetter. 39 type BasicReleaser struct { 40 releaser Releaser 41 released bool 42 } 43 44 // Released returns whether Release method already called. 45 func (r *BasicReleaser) Released() bool { 46 return r.released 47 } 48 49 // Release implements Releaser.Release. 50 func (r *BasicReleaser) Release() { 51 if !r.released { 52 if r.releaser != nil { 53 r.releaser.Release() 54 r.releaser = nil 55 } 56 r.released = true 57 } 58 } 59 60 // SetReleaser implements ReleaseSetter.SetReleaser. 61 func (r *BasicReleaser) SetReleaser(releaser Releaser) { 62 if r.released { 63 panic(ErrReleased) 64 } 65 if r.releaser != nil && releaser != nil { 66 panic(ErrHasReleaser) 67 } 68 r.releaser = releaser 69 } 70 71 type NoopReleaser struct{} 72 73 func (NoopReleaser) Release() {} 74