snapshot: sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1
Содержимое пина, зафиксированного в go.mod sing-box-lx, одним коммитом без истории. Полная история SagerNet/gvisor — 1.45 ГБ и клонируется в каждой CI-джобе; наша дельта — одна вставка в одну функцию, история для неё не нужна. Module path github.com/sagernet/gvisor сохранён намеренно: на него опирается replace-директива суперпроекта. Патч поверх — отдельным коммитом, чтобы дельта читалась одним git show и переносилась на новый пин копированием. SPECS/TASKS/048-GVISOR_HANDSHAKE_NIL_CRASH
This commit is contained in:
commit
2c4ae3b0a4
712 changed files with 185689 additions and 0 deletions
212
pkg/atomicbitops/aligned_64bit.go
Normal file
212
pkg/atomicbitops/aligned_64bit.go
Normal file
|
|
@ -0,0 +1,212 @@
|
|||
// Copyright 2021 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//go:build !arm && !mips && !mipsle && !386
|
||||
// +build !arm,!mips,!mipsle,!386
|
||||
|
||||
package atomicbitops
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/sagernet/gvisor/pkg/sync"
|
||||
)
|
||||
|
||||
// Int64 is an atomic int64 that is guaranteed to be 64-bit
|
||||
// aligned, even on 32-bit systems. On most architectures, it's just a regular
|
||||
// int64.
|
||||
//
|
||||
// The default value is zero.
|
||||
//
|
||||
// Don't add fields to this struct. It is important that it remain the same
|
||||
// size as its builtin analogue.
|
||||
//
|
||||
// See aligned_32bit_unsafe.go in this directory for justification.
|
||||
//
|
||||
// +stateify savable
|
||||
type Int64 struct {
|
||||
_ sync.NoCopy
|
||||
value int64
|
||||
}
|
||||
|
||||
// FromInt64 returns an Int64 initialized to value v.
|
||||
//
|
||||
//go:nosplit
|
||||
func FromInt64(v int64) Int64 {
|
||||
return Int64{value: v}
|
||||
}
|
||||
|
||||
// Load is analogous to atomic.LoadInt64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) Load() int64 {
|
||||
return atomic.LoadInt64(&i.value)
|
||||
}
|
||||
|
||||
// RacyLoad is analogous to reading an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) RacyLoad() int64 {
|
||||
return i.value
|
||||
}
|
||||
|
||||
// Store is analogous to atomic.StoreInt64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) Store(v int64) {
|
||||
atomic.StoreInt64(&i.value, v)
|
||||
}
|
||||
|
||||
// RacyStore is analogous to setting an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) RacyStore(v int64) {
|
||||
i.value = v
|
||||
}
|
||||
|
||||
// Add is analogous to atomic.AddInt64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) Add(v int64) int64 {
|
||||
return atomic.AddInt64(&i.value, v)
|
||||
}
|
||||
|
||||
// RacyAdd is analogous to adding to an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) RacyAdd(v int64) int64 {
|
||||
i.value += v
|
||||
return i.value
|
||||
}
|
||||
|
||||
// Swap is analogous to atomic.SwapInt64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) Swap(v int64) int64 {
|
||||
return atomic.SwapInt64(&i.value, v)
|
||||
}
|
||||
|
||||
// CompareAndSwap is analogous to atomic.CompareAndSwapInt64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (i *Int64) CompareAndSwap(oldVal, newVal int64) bool {
|
||||
return atomic.CompareAndSwapInt64(&i.value, oldVal, newVal)
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func (i *Int64) ptr() *int64 {
|
||||
return &i.value
|
||||
}
|
||||
|
||||
// Uint64 is an atomic uint64 that is guaranteed to be 64-bit
|
||||
// aligned, even on 32-bit systems. On most architectures, it's just a regular
|
||||
// uint64.
|
||||
//
|
||||
// Don't add fields to this struct. It is important that it remain the same
|
||||
// size as its builtin analogue.
|
||||
//
|
||||
// See aligned_unsafe.go in this directory for justification.
|
||||
//
|
||||
// +stateify savable
|
||||
type Uint64 struct {
|
||||
_ sync.NoCopy
|
||||
value uint64
|
||||
}
|
||||
|
||||
// FromUint64 returns an Uint64 initialized to value v.
|
||||
//
|
||||
//go:nosplit
|
||||
func FromUint64(v uint64) Uint64 {
|
||||
return Uint64{value: v}
|
||||
}
|
||||
|
||||
// Load is analogous to atomic.LoadUint64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) Load() uint64 {
|
||||
return atomic.LoadUint64(&u.value)
|
||||
}
|
||||
|
||||
// RacyLoad is analogous to reading an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) RacyLoad() uint64 {
|
||||
return u.value
|
||||
}
|
||||
|
||||
// Store is analogous to atomic.StoreUint64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) Store(v uint64) {
|
||||
atomic.StoreUint64(&u.value, v)
|
||||
}
|
||||
|
||||
// RacyStore is analogous to setting an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) RacyStore(v uint64) {
|
||||
u.value = v
|
||||
}
|
||||
|
||||
// Add is analogous to atomic.AddUint64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) Add(v uint64) uint64 {
|
||||
return atomic.AddUint64(&u.value, v)
|
||||
}
|
||||
|
||||
// RacyAdd is analogous to adding to an atomic value without using
|
||||
// synchronization.
|
||||
//
|
||||
// It may be helpful to document why a racy operation is permitted.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) RacyAdd(v uint64) uint64 {
|
||||
u.value += v
|
||||
return u.value
|
||||
}
|
||||
|
||||
// Swap is analogous to atomic.SwapUint64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) Swap(v uint64) uint64 {
|
||||
return atomic.SwapUint64(&u.value, v)
|
||||
}
|
||||
|
||||
// CompareAndSwap is analogous to atomic.CompareAndSwapUint64.
|
||||
//
|
||||
//go:nosplit
|
||||
func (u *Uint64) CompareAndSwap(oldVal, newVal uint64) bool {
|
||||
return atomic.CompareAndSwapUint64(&u.value, oldVal, newVal)
|
||||
}
|
||||
|
||||
//go:nosplit
|
||||
func (u *Uint64) ptr() *uint64 {
|
||||
return &u.value
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue