mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// 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() {}
 |