github.com/cockroachdb/pebble@v1.1.2/internal/cache/refcnt_normal.go (about)

     1  // Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use
     2  // of this source code is governed by a BSD-style license that can be found in
     3  // the LICENSE file.
     4  
     5  //go:build !tracing
     6  // +build !tracing
     7  
     8  package cache
     9  
    10  import (
    11  	"fmt"
    12  	"sync/atomic"
    13  
    14  	"github.com/cockroachdb/redact"
    15  )
    16  
    17  // refcnt provides an atomic reference count. This version is used when the
    18  // "tracing" build tag is not enabled. See refcnt_tracing.go for the "tracing"
    19  // enabled version.
    20  type refcnt struct {
    21  	val atomic.Int32
    22  }
    23  
    24  // initialize the reference count to the specified value.
    25  func (v *refcnt) init(val int32) {
    26  	v.val.Store(val)
    27  }
    28  
    29  func (v *refcnt) refs() int32 {
    30  	return v.val.Load()
    31  }
    32  
    33  func (v *refcnt) acquire() {
    34  	switch v := v.val.Add(1); {
    35  	case v <= 1:
    36  		panic(redact.Safe(fmt.Sprintf("pebble: inconsistent reference count: %d", v)))
    37  	}
    38  }
    39  
    40  func (v *refcnt) release() bool {
    41  	switch v := v.val.Add(-1); {
    42  	case v < 0:
    43  		panic(redact.Safe(fmt.Sprintf("pebble: inconsistent reference count: %d", v)))
    44  	case v == 0:
    45  		return true
    46  	default:
    47  		return false
    48  	}
    49  }
    50  
    51  func (v *refcnt) trace(msg string) {
    52  }
    53  
    54  func (v *refcnt) traces() string {
    55  	return ""
    56  }
    57  
    58  // Silence unused warning.
    59  var _ = (*refcnt)(nil).traces