1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
"github.com/juju/errors"
11
"github.com/juju/juju/state"
14
var ErrStateClosed = errors.New("state closed")
16
// StateTracker describes a type which wraps and manages the lifetime
18
type StateTracker interface {
19
// Use returns wrapped State, recording the use of
20
// it. ErrStateClosed is returned if the State is closed.
21
Use() (*state.State, error)
23
// Done records that there's one less user of the wrapped State,
24
// closing it if there's no more users. ErrStateClosed is returned
25
// if the State has already been closed (indicating that Done has
26
// called too many times).
30
// stateTracker wraps a *state.State, keeping a reference count and
31
// closing the State when there are no longer any references to it. It
32
// implements StateTracker.
34
// The reference count starts at 1. Done should be called exactly 1 +
35
// number of calls to Use.
36
type stateTracker struct {
42
func newStateTracker(st *state.State) StateTracker {
49
// Use implements StateTracker.
50
func (c *stateTracker) Use() (*state.State, error) {
54
if c.references == 0 {
55
return nil, ErrStateClosed
61
// Done implements StateTracker.
62
func (c *stateTracker) Done() error {
66
if c.references == 0 {
70
if c.references == 0 {
73
logger.Errorf("error when closing state: %v", err)