mirror of
https://github.com/golang/net.git
synced 2026-04-01 02:47:08 +09:00
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>
32 lines
714 B
Go
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())
|
|
}
|