You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
// All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Package util provides utilities used throughout leveldb.
package util
import ( "errors" )
var ( ErrReleased = errors.New("leveldb: resource already relesed") ErrHasReleaser = errors.New("leveldb: releaser already defined") )
// Releaser is the interface that wraps the basic Release method.
type Releaser interface { // Release releases associated resources. Release should always success
// and can be called multiple times without causing error.
Release() }
// ReleaseSetter is the interface that wraps the basic SetReleaser method.
type ReleaseSetter interface { // SetReleaser associates the given releaser to the resources. The
// releaser will be called once coresponding resources released.
// Calling SetReleaser with nil will clear the releaser.
//
// This will panic if a releaser already present or coresponding
// resource is already released. Releaser should be cleared first
// before assigned a new one.
SetReleaser(releaser Releaser) }
// BasicReleaser provides basic implementation of Releaser and ReleaseSetter.
type BasicReleaser struct { releaser Releaser released bool }
// Released returns whether Release method already called.
func (r *BasicReleaser) Released() bool { return r.released }
// Release implements Releaser.Release.
func (r *BasicReleaser) Release() { if !r.released { if r.releaser != nil { r.releaser.Release() r.releaser = nil } r.released = true } }
// SetReleaser implements ReleaseSetter.SetReleaser.
func (r *BasicReleaser) SetReleaser(releaser Releaser) { if r.released { panic(ErrReleased) } if r.releaser != nil && releaser != nil { panic(ErrHasReleaser) } r.releaser = releaser }
type NoopReleaser struct{}
func (NoopReleaser) Release() {}
|