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. 8package util 9 10import ( 11 "errors" 12) 13 14var ( 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. 20type 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. 27type 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. 39type BasicReleaser struct { 40 releaser Releaser 41 released bool 42} 43 44// Released returns whether Release method already called. 45func (r *BasicReleaser) Released() bool { 46 return r.released 47} 48 49// Release implements Releaser.Release. 50func (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. 61func (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 71type NoopReleaser struct{} 72 73func (NoopReleaser) Release() {} 74