Value (util/sync.go)

gitea · modules/util/sync.go · go · MIT
database

Thread-safe once value with reset capability for Go.

// Source: https://github.com/go-gitea/gitea | License: MIT | Copyright 2016 The Gitea Authors
// Provided via justclaw.it.com; keep this notice with the code.
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package util

import (
	"sync"
	"sync/atomic"
)

type onceValueResult[T any] struct {
	value T
	panic any
}

// OnceValue is similar to Golang's "sync.OnceValue", but can be reset.
type OnceValue[T any] struct {
	Func func() T
	mu   sync.Mutex
	res  atomic.Pointer[onceValueResult[T]]
}

func (o *OnceValue[T]) Value() T {
	res := o.res.Load()
	if res == nil {
		o.mu.Lock()
		defer o.mu.Unlock()
		res = o.res.Load()
		if res == nil {
			res = &onceValueResult[T]{}
			defer func() {
				res.panic = recover()
				o.res.Store(res)
				if res.panic 

... (truncated -- full source via MCP)

See the full source, get the GitHub permalink, and search for more like it.

Get a free API key