Files
golang.net/quic/atomic_bits.go
Damien Neil dd0b200aed quic: remove go1.21 build constraint
The x/net go.mod now depends on go1.23.

Change-Id: I24960949d84753f84f75fbdc97b7dfb92191a4d2
Reviewed-on: https://go-review.googlesource.com/c/net/+/664295
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
2025-04-09 15:11:44 -07:00

32 lines
714 B
Go

// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package quic
import "sync/atomic"
// atomicBits is an atomic uint32 that supports setting individual bits.
type atomicBits[T ~uint32] struct {
bits atomic.Uint32
}
// set sets the bits in mask to the corresponding bits in v.
// It returns the new value.
func (a *atomicBits[T]) set(v, mask T) T {
if v&^mask != 0 {
panic("BUG: bits in v are not in mask")
}
for {
o := a.bits.Load()
n := (o &^ uint32(mask)) | uint32(v)
if a.bits.CompareAndSwap(o, n) {
return T(n)
}
}
}
func (a *atomicBits[T]) load() T {
return T(a.bits.Load())
}