parent
4f086f2626
commit
c22e2ce46e
@ -0,0 +1,38 @@
|
|||||||
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the MIT License.
|
||||||
|
// If a copy of the MIT was not distributed with this file,
|
||||||
|
// You can obtain one at https://github.com/gogf/gf.
|
||||||
|
|
||||||
|
package gctx
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// neverDoneCtx never done.
|
||||||
|
type neverDoneCtx struct {
|
||||||
|
context.Context
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done forbids the context done from parent context.
|
||||||
|
func (*neverDoneCtx) Done() <-chan struct{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deadline forbids the context deadline from parent context.
|
||||||
|
func (*neverDoneCtx) Deadline() (deadline time.Time, ok bool) {
|
||||||
|
return time.Time{}, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Err forbids the context done from parent context.
|
||||||
|
func (c *neverDoneCtx) Err() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NeverDone wraps and returns a new context object that will be never done,
|
||||||
|
// which forbids the context manually done, to make the context can be propagated to asynchronous goroutines.
|
||||||
|
func NeverDone(ctx context.Context) context.Context {
|
||||||
|
return &neverDoneCtx{ctx}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
//go:build go1.20
|
||||||
|
// +build go1.20
|
||||||
|
|
||||||
|
package maxminddb
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
func reflectSetZero(v reflect.Value) {
|
||||||
|
v.SetZero()
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
//go:build !go1.20
|
||||||
|
// +build !go1.20
|
||||||
|
|
||||||
|
package maxminddb
|
||||||
|
|
||||||
|
import "reflect"
|
||||||
|
|
||||||
|
func reflectSetZero(v reflect.Value) {
|
||||||
|
v.Set(reflect.Zero(v.Type()))
|
||||||
|
}
|
@ -1,19 +0,0 @@
|
|||||||
coverage:
|
|
||||||
range: 80..100
|
|
||||||
round: down
|
|
||||||
precision: 2
|
|
||||||
|
|
||||||
status:
|
|
||||||
project: # measuring the overall project coverage
|
|
||||||
default: # context, you can create multiple ones with custom titles
|
|
||||||
enabled: yes # must be yes|true to enable this status
|
|
||||||
target: 100 # specify the target coverage for each commit status
|
|
||||||
# option: "auto" (must increase from parent commit or pull request base)
|
|
||||||
# option: "X%" a static target percentage to hit
|
|
||||||
if_not_found: success # if parent is not found report status as success, error, or failure
|
|
||||||
if_ci_failed: error # if ci fails report status as success, error, or failure
|
|
||||||
|
|
||||||
# Also update COVER_IGNORE_PKGS in the Makefile.
|
|
||||||
ignore:
|
|
||||||
- /internal/gen-atomicint/
|
|
||||||
- /internal/gen-valuewrapper/
|
|
@ -1,15 +0,0 @@
|
|||||||
/bin
|
|
||||||
.DS_Store
|
|
||||||
/vendor
|
|
||||||
cover.html
|
|
||||||
cover.out
|
|
||||||
lint.log
|
|
||||||
|
|
||||||
# Binaries
|
|
||||||
*.test
|
|
||||||
|
|
||||||
# Profiling output
|
|
||||||
*.prof
|
|
||||||
|
|
||||||
# Output of fossa analyzer
|
|
||||||
/fossa
|
|
@ -1,127 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
||||||
|
|
||||||
## [1.11.0] - 2023-05-02
|
|
||||||
### Fixed
|
|
||||||
- Fix initialization of `Value` wrappers.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Add `String` method to `atomic.Pointer[T]` type allowing users to safely print
|
|
||||||
underlying values of pointers.
|
|
||||||
|
|
||||||
[1.11.0]: https://github.com/uber-go/atomic/compare/v1.10.0...v1.11.0
|
|
||||||
|
|
||||||
## [1.10.0] - 2022-08-11
|
|
||||||
### Added
|
|
||||||
- Add `atomic.Float32` type for atomic operations on `float32`.
|
|
||||||
- Add `CompareAndSwap` and `Swap` methods to `atomic.String`, `atomic.Error`,
|
|
||||||
and `atomic.Value`.
|
|
||||||
- Add generic `atomic.Pointer[T]` type for atomic operations on pointers of any
|
|
||||||
type. This is present only for Go 1.18 or higher, and is a drop-in for
|
|
||||||
replacement for the standard library's `sync/atomic.Pointer` type.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Deprecate `CAS` methods on all types in favor of corresponding
|
|
||||||
`CompareAndSwap` methods.
|
|
||||||
|
|
||||||
Thanks to @eNV25 and @icpd for their contributions to this release.
|
|
||||||
|
|
||||||
[1.10.0]: https://github.com/uber-go/atomic/compare/v1.9.0...v1.10.0
|
|
||||||
|
|
||||||
## [1.9.0] - 2021-07-15
|
|
||||||
### Added
|
|
||||||
- Add `Float64.Swap` to match int atomic operations.
|
|
||||||
- Add `atomic.Time` type for atomic operations on `time.Time` values.
|
|
||||||
|
|
||||||
[1.9.0]: https://github.com/uber-go/atomic/compare/v1.8.0...v1.9.0
|
|
||||||
|
|
||||||
## [1.8.0] - 2021-06-09
|
|
||||||
### Added
|
|
||||||
- Add `atomic.Uintptr` type for atomic operations on `uintptr` values.
|
|
||||||
- Add `atomic.UnsafePointer` type for atomic operations on `unsafe.Pointer` values.
|
|
||||||
|
|
||||||
[1.8.0]: https://github.com/uber-go/atomic/compare/v1.7.0...v1.8.0
|
|
||||||
|
|
||||||
## [1.7.0] - 2020-09-14
|
|
||||||
### Added
|
|
||||||
- Support JSON serialization and deserialization of primitive atomic types.
|
|
||||||
- Support Text marshalling and unmarshalling for string atomics.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Disallow incorrect comparison of atomic values in a non-atomic way.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- Remove dependency on `golang.org/x/{lint, tools}`.
|
|
||||||
|
|
||||||
[1.7.0]: https://github.com/uber-go/atomic/compare/v1.6.0...v1.7.0
|
|
||||||
|
|
||||||
## [1.6.0] - 2020-02-24
|
|
||||||
### Changed
|
|
||||||
- Drop library dependency on `golang.org/x/{lint, tools}`.
|
|
||||||
|
|
||||||
[1.6.0]: https://github.com/uber-go/atomic/compare/v1.5.1...v1.6.0
|
|
||||||
|
|
||||||
## [1.5.1] - 2019-11-19
|
|
||||||
- Fix bug where `Bool.CAS` and `Bool.Toggle` do work correctly together
|
|
||||||
causing `CAS` to fail even though the old value matches.
|
|
||||||
|
|
||||||
[1.5.1]: https://github.com/uber-go/atomic/compare/v1.5.0...v1.5.1
|
|
||||||
|
|
||||||
## [1.5.0] - 2019-10-29
|
|
||||||
### Changed
|
|
||||||
- With Go modules, only the `go.uber.org/atomic` import path is supported now.
|
|
||||||
If you need to use the old import path, please add a `replace` directive to
|
|
||||||
your `go.mod`.
|
|
||||||
|
|
||||||
[1.5.0]: https://github.com/uber-go/atomic/compare/v1.4.0...v1.5.0
|
|
||||||
|
|
||||||
## [1.4.0] - 2019-05-01
|
|
||||||
### Added
|
|
||||||
- Add `atomic.Error` type for atomic operations on `error` values.
|
|
||||||
|
|
||||||
[1.4.0]: https://github.com/uber-go/atomic/compare/v1.3.2...v1.4.0
|
|
||||||
|
|
||||||
## [1.3.2] - 2018-05-02
|
|
||||||
### Added
|
|
||||||
- Add `atomic.Duration` type for atomic operations on `time.Duration` values.
|
|
||||||
|
|
||||||
[1.3.2]: https://github.com/uber-go/atomic/compare/v1.3.1...v1.3.2
|
|
||||||
|
|
||||||
## [1.3.1] - 2017-11-14
|
|
||||||
### Fixed
|
|
||||||
- Revert optimization for `atomic.String.Store("")` which caused data races.
|
|
||||||
|
|
||||||
[1.3.1]: https://github.com/uber-go/atomic/compare/v1.3.0...v1.3.1
|
|
||||||
|
|
||||||
## [1.3.0] - 2017-11-13
|
|
||||||
### Added
|
|
||||||
- Add `atomic.Bool.CAS` for compare-and-swap semantics on bools.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Optimize `atomic.String.Store("")` by avoiding an allocation.
|
|
||||||
|
|
||||||
[1.3.0]: https://github.com/uber-go/atomic/compare/v1.2.0...v1.3.0
|
|
||||||
|
|
||||||
## [1.2.0] - 2017-04-12
|
|
||||||
### Added
|
|
||||||
- Shadow `atomic.Value` from `sync/atomic`.
|
|
||||||
|
|
||||||
[1.2.0]: https://github.com/uber-go/atomic/compare/v1.1.0...v1.2.0
|
|
||||||
|
|
||||||
## [1.1.0] - 2017-03-10
|
|
||||||
### Added
|
|
||||||
- Add atomic `Float64` type.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Support new `go.uber.org/atomic` import path.
|
|
||||||
|
|
||||||
[1.1.0]: https://github.com/uber-go/atomic/compare/v1.0.0...v1.1.0
|
|
||||||
|
|
||||||
## [1.0.0] - 2016-07-18
|
|
||||||
|
|
||||||
- Initial release.
|
|
||||||
|
|
||||||
[1.0.0]: https://github.com/uber-go/atomic/releases/tag/v1.0.0
|
|
@ -1,19 +0,0 @@
|
|||||||
Copyright (c) 2016 Uber Technologies, Inc.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
@ -1,79 +0,0 @@
|
|||||||
# Directory to place `go install`ed binaries into.
|
|
||||||
export GOBIN ?= $(shell pwd)/bin
|
|
||||||
|
|
||||||
GOLINT = $(GOBIN)/golint
|
|
||||||
GEN_ATOMICINT = $(GOBIN)/gen-atomicint
|
|
||||||
GEN_ATOMICWRAPPER = $(GOBIN)/gen-atomicwrapper
|
|
||||||
STATICCHECK = $(GOBIN)/staticcheck
|
|
||||||
|
|
||||||
GO_FILES ?= $(shell find . '(' -path .git -o -path vendor ')' -prune -o -name '*.go' -print)
|
|
||||||
|
|
||||||
# Also update ignore section in .codecov.yml.
|
|
||||||
COVER_IGNORE_PKGS = \
|
|
||||||
go.uber.org/atomic/internal/gen-atomicint \
|
|
||||||
go.uber.org/atomic/internal/gen-atomicwrapper
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
build:
|
|
||||||
go build ./...
|
|
||||||
|
|
||||||
.PHONY: test
|
|
||||||
test:
|
|
||||||
go test -race ./...
|
|
||||||
|
|
||||||
.PHONY: gofmt
|
|
||||||
gofmt:
|
|
||||||
$(eval FMT_LOG := $(shell mktemp -t gofmt.XXXXX))
|
|
||||||
gofmt -e -s -l $(GO_FILES) > $(FMT_LOG) || true
|
|
||||||
@[ ! -s "$(FMT_LOG)" ] || (echo "gofmt failed:" && cat $(FMT_LOG) && false)
|
|
||||||
|
|
||||||
$(GOLINT):
|
|
||||||
cd tools && go install golang.org/x/lint/golint
|
|
||||||
|
|
||||||
$(STATICCHECK):
|
|
||||||
cd tools && go install honnef.co/go/tools/cmd/staticcheck
|
|
||||||
|
|
||||||
$(GEN_ATOMICWRAPPER): $(wildcard ./internal/gen-atomicwrapper/*)
|
|
||||||
go build -o $@ ./internal/gen-atomicwrapper
|
|
||||||
|
|
||||||
$(GEN_ATOMICINT): $(wildcard ./internal/gen-atomicint/*)
|
|
||||||
go build -o $@ ./internal/gen-atomicint
|
|
||||||
|
|
||||||
.PHONY: golint
|
|
||||||
golint: $(GOLINT)
|
|
||||||
$(GOLINT) ./...
|
|
||||||
|
|
||||||
.PHONY: staticcheck
|
|
||||||
staticcheck: $(STATICCHECK)
|
|
||||||
$(STATICCHECK) ./...
|
|
||||||
|
|
||||||
.PHONY: lint
|
|
||||||
lint: gofmt golint staticcheck generatenodirty
|
|
||||||
|
|
||||||
# comma separated list of packages to consider for code coverage.
|
|
||||||
COVER_PKG = $(shell \
|
|
||||||
go list -find ./... | \
|
|
||||||
grep -v $(foreach pkg,$(COVER_IGNORE_PKGS),-e "^$(pkg)$$") | \
|
|
||||||
paste -sd, -)
|
|
||||||
|
|
||||||
.PHONY: cover
|
|
||||||
cover:
|
|
||||||
go test -coverprofile=cover.out -coverpkg $(COVER_PKG) -v ./...
|
|
||||||
go tool cover -html=cover.out -o cover.html
|
|
||||||
|
|
||||||
.PHONY: generate
|
|
||||||
generate: $(GEN_ATOMICINT) $(GEN_ATOMICWRAPPER)
|
|
||||||
go generate ./...
|
|
||||||
|
|
||||||
.PHONY: generatenodirty
|
|
||||||
generatenodirty:
|
|
||||||
@[ -z "$$(git status --porcelain)" ] || ( \
|
|
||||||
echo "Working tree is dirty. Commit your changes first."; \
|
|
||||||
git status; \
|
|
||||||
exit 1 )
|
|
||||||
@make generate
|
|
||||||
@status=$$(git status --porcelain); \
|
|
||||||
[ -z "$$status" ] || ( \
|
|
||||||
echo "Working tree is dirty after `make generate`:"; \
|
|
||||||
echo "$$status"; \
|
|
||||||
echo "Please ensure that the generated code is up-to-date." )
|
|
@ -1,63 +0,0 @@
|
|||||||
# atomic [![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![Go Report Card][reportcard-img]][reportcard]
|
|
||||||
|
|
||||||
Simple wrappers for primitive types to enforce atomic access.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ go get -u go.uber.org/atomic@v1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Legacy Import Path
|
|
||||||
|
|
||||||
As of v1.5.0, the import path `go.uber.org/atomic` is the only supported way
|
|
||||||
of using this package. If you are using Go modules, this package will fail to
|
|
||||||
compile with the legacy import path path `github.com/uber-go/atomic`.
|
|
||||||
|
|
||||||
We recommend migrating your code to the new import path but if you're unable
|
|
||||||
to do so, or if your dependencies are still using the old import path, you
|
|
||||||
will have to add a `replace` directive to your `go.mod` file downgrading the
|
|
||||||
legacy import path to an older version.
|
|
||||||
|
|
||||||
```
|
|
||||||
replace github.com/uber-go/atomic => github.com/uber-go/atomic v1.4.0
|
|
||||||
```
|
|
||||||
|
|
||||||
You can do so automatically by running the following command.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ go mod edit -replace github.com/uber-go/atomic=github.com/uber-go/atomic@v1.4.0
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
The standard library's `sync/atomic` is powerful, but it's easy to forget which
|
|
||||||
variables must be accessed atomically. `go.uber.org/atomic` preserves all the
|
|
||||||
functionality of the standard library, but wraps the primitive types to
|
|
||||||
provide a safer, more convenient API.
|
|
||||||
|
|
||||||
```go
|
|
||||||
var atom atomic.Uint32
|
|
||||||
atom.Store(42)
|
|
||||||
atom.Sub(2)
|
|
||||||
atom.CAS(40, 11)
|
|
||||||
```
|
|
||||||
|
|
||||||
See the [documentation][doc] for a complete API specification.
|
|
||||||
|
|
||||||
## Development Status
|
|
||||||
|
|
||||||
Stable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
Released under the [MIT License](LICENSE.txt).
|
|
||||||
|
|
||||||
[doc-img]: https://godoc.org/github.com/uber-go/atomic?status.svg
|
|
||||||
[doc]: https://godoc.org/go.uber.org/atomic
|
|
||||||
[ci-img]: https://github.com/uber-go/atomic/actions/workflows/go.yml/badge.svg
|
|
||||||
[ci]: https://github.com/uber-go/atomic/actions/workflows/go.yml
|
|
||||||
[cov-img]: https://codecov.io/gh/uber-go/atomic/branch/master/graph/badge.svg
|
|
||||||
[cov]: https://codecov.io/gh/uber-go/atomic
|
|
||||||
[reportcard-img]: https://goreportcard.com/badge/go.uber.org/atomic
|
|
||||||
[reportcard]: https://goreportcard.com/report/go.uber.org/atomic
|
|
@ -1,88 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Bool is an atomic type-safe wrapper for bool values.
|
|
||||||
type Bool struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroBool bool
|
|
||||||
|
|
||||||
// NewBool creates a new Bool.
|
|
||||||
func NewBool(val bool) *Bool {
|
|
||||||
x := &Bool{}
|
|
||||||
if val != _zeroBool {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped bool.
|
|
||||||
func (x *Bool) Load() bool {
|
|
||||||
return truthy(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed bool.
|
|
||||||
func (x *Bool) Store(val bool) {
|
|
||||||
x.v.Store(boolToInt(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap for bool values.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (x *Bool) CAS(old, new bool) (swapped bool) {
|
|
||||||
return x.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for bool values.
|
|
||||||
func (x *Bool) CompareAndSwap(old, new bool) (swapped bool) {
|
|
||||||
return x.v.CompareAndSwap(boolToInt(old), boolToInt(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given bool and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *Bool) Swap(val bool) (old bool) {
|
|
||||||
return truthy(x.v.Swap(boolToInt(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped bool into JSON.
|
|
||||||
func (x *Bool) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(x.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes a bool from JSON.
|
|
||||||
func (x *Bool) UnmarshalJSON(b []byte) error {
|
|
||||||
var v bool
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
x.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Bool -type=bool -wrapped=Uint32 -pack=boolToInt -unpack=truthy -cas -swap -json -file=bool.go
|
|
||||||
|
|
||||||
func truthy(n uint32) bool {
|
|
||||||
return n == 1
|
|
||||||
}
|
|
||||||
|
|
||||||
func boolToInt(b bool) uint32 {
|
|
||||||
if b {
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// Toggle atomically negates the Boolean and returns the previous value.
|
|
||||||
func (b *Bool) Toggle() (old bool) {
|
|
||||||
for {
|
|
||||||
old := b.Load()
|
|
||||||
if b.CAS(old, !old) {
|
|
||||||
return old
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (b *Bool) String() string {
|
|
||||||
return strconv.FormatBool(b.Load())
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
// Package atomic provides simple wrappers around numerics to enforce atomic
|
|
||||||
// access.
|
|
||||||
package atomic
|
|
@ -1,89 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Duration is an atomic type-safe wrapper for time.Duration values.
|
|
||||||
type Duration struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Int64
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroDuration time.Duration
|
|
||||||
|
|
||||||
// NewDuration creates a new Duration.
|
|
||||||
func NewDuration(val time.Duration) *Duration {
|
|
||||||
x := &Duration{}
|
|
||||||
if val != _zeroDuration {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped time.Duration.
|
|
||||||
func (x *Duration) Load() time.Duration {
|
|
||||||
return time.Duration(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed time.Duration.
|
|
||||||
func (x *Duration) Store(val time.Duration) {
|
|
||||||
x.v.Store(int64(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap for time.Duration values.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (x *Duration) CAS(old, new time.Duration) (swapped bool) {
|
|
||||||
return x.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for time.Duration values.
|
|
||||||
func (x *Duration) CompareAndSwap(old, new time.Duration) (swapped bool) {
|
|
||||||
return x.v.CompareAndSwap(int64(old), int64(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given time.Duration and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *Duration) Swap(val time.Duration) (old time.Duration) {
|
|
||||||
return time.Duration(x.v.Swap(int64(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped time.Duration into JSON.
|
|
||||||
func (x *Duration) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(x.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes a time.Duration from JSON.
|
|
||||||
func (x *Duration) UnmarshalJSON(b []byte) error {
|
|
||||||
var v time.Duration
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
x.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Duration -type=time.Duration -wrapped=Int64 -pack=int64 -unpack=time.Duration -cas -swap -json -imports time -file=duration.go
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped time.Duration and returns the new value.
|
|
||||||
func (d *Duration) Add(delta time.Duration) time.Duration {
|
|
||||||
return time.Duration(d.v.Add(int64(delta)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped time.Duration and returns the new value.
|
|
||||||
func (d *Duration) Sub(delta time.Duration) time.Duration {
|
|
||||||
return time.Duration(d.v.Sub(int64(delta)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (d *Duration) String() string {
|
|
||||||
return d.Load().String()
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
// Error is an atomic type-safe wrapper for error values.
|
|
||||||
type Error struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Value
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroError error
|
|
||||||
|
|
||||||
// NewError creates a new Error.
|
|
||||||
func NewError(val error) *Error {
|
|
||||||
x := &Error{}
|
|
||||||
if val != _zeroError {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped error.
|
|
||||||
func (x *Error) Load() error {
|
|
||||||
return unpackError(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed error.
|
|
||||||
func (x *Error) Store(val error) {
|
|
||||||
x.v.Store(packError(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for error values.
|
|
||||||
func (x *Error) CompareAndSwap(old, new error) (swapped bool) {
|
|
||||||
if x.v.CompareAndSwap(packError(old), packError(new)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if old == _zeroError {
|
|
||||||
// If the old value is the empty value, then it's possible the
|
|
||||||
// underlying Value hasn't been set and is nil, so retry with nil.
|
|
||||||
return x.v.CompareAndSwap(nil, packError(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given error and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *Error) Swap(val error) (old error) {
|
|
||||||
return unpackError(x.v.Swap(packError(val)))
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
// Copyright (c) 2020-2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
// atomic.Value panics on nil inputs, or if the underlying type changes.
|
|
||||||
// Stabilize by always storing a custom struct that we control.
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Error -type=error -wrapped=Value -pack=packError -unpack=unpackError -compareandswap -swap -file=error.go
|
|
||||||
|
|
||||||
type packedError struct{ Value error }
|
|
||||||
|
|
||||||
func packError(v error) interface{} {
|
|
||||||
return packedError{v}
|
|
||||||
}
|
|
||||||
|
|
||||||
func unpackError(v interface{}) error {
|
|
||||||
if err, ok := v.(packedError); ok {
|
|
||||||
return err.Value
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Float32 is an atomic type-safe wrapper for float32 values.
|
|
||||||
type Float32 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroFloat32 float32
|
|
||||||
|
|
||||||
// NewFloat32 creates a new Float32.
|
|
||||||
func NewFloat32(val float32) *Float32 {
|
|
||||||
x := &Float32{}
|
|
||||||
if val != _zeroFloat32 {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped float32.
|
|
||||||
func (x *Float32) Load() float32 {
|
|
||||||
return math.Float32frombits(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed float32.
|
|
||||||
func (x *Float32) Store(val float32) {
|
|
||||||
x.v.Store(math.Float32bits(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given float32 and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *Float32) Swap(val float32) (old float32) {
|
|
||||||
return math.Float32frombits(x.v.Swap(math.Float32bits(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped float32 into JSON.
|
|
||||||
func (x *Float32) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(x.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes a float32 from JSON.
|
|
||||||
func (x *Float32) UnmarshalJSON(b []byte) error {
|
|
||||||
var v float32
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
x.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
// Copyright (c) 2020-2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Float32 -type=float32 -wrapped=Uint32 -pack=math.Float32bits -unpack=math.Float32frombits -swap -json -imports math -file=float32.go
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped float32 and returns the new value.
|
|
||||||
func (f *Float32) Add(delta float32) float32 {
|
|
||||||
for {
|
|
||||||
old := f.Load()
|
|
||||||
new := old + delta
|
|
||||||
if f.CAS(old, new) {
|
|
||||||
return new
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped float32 and returns the new value.
|
|
||||||
func (f *Float32) Sub(delta float32) float32 {
|
|
||||||
return f.Add(-delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap for float32 values.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap
|
|
||||||
func (f *Float32) CAS(old, new float32) (swapped bool) {
|
|
||||||
return f.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for float32 values.
|
|
||||||
//
|
|
||||||
// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators
|
|
||||||
// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN.
|
|
||||||
// This avoids typical CompareAndSwap loops from blocking forever, e.g.,
|
|
||||||
//
|
|
||||||
// for {
|
|
||||||
// old := atom.Load()
|
|
||||||
// new = f(old)
|
|
||||||
// if atom.CompareAndSwap(old, new) {
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// If CompareAndSwap did not match NaN to match, then the above would loop forever.
|
|
||||||
func (f *Float32) CompareAndSwap(old, new float32) (swapped bool) {
|
|
||||||
return f.v.CompareAndSwap(math.Float32bits(old), math.Float32bits(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (f *Float32) String() string {
|
|
||||||
// 'g' is the behavior for floats with %v.
|
|
||||||
return strconv.FormatFloat(float64(f.Load()), 'g', -1, 32)
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"math"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Float64 is an atomic type-safe wrapper for float64 values.
|
|
||||||
type Float64 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroFloat64 float64
|
|
||||||
|
|
||||||
// NewFloat64 creates a new Float64.
|
|
||||||
func NewFloat64(val float64) *Float64 {
|
|
||||||
x := &Float64{}
|
|
||||||
if val != _zeroFloat64 {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped float64.
|
|
||||||
func (x *Float64) Load() float64 {
|
|
||||||
return math.Float64frombits(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed float64.
|
|
||||||
func (x *Float64) Store(val float64) {
|
|
||||||
x.v.Store(math.Float64bits(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given float64 and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *Float64) Swap(val float64) (old float64) {
|
|
||||||
return math.Float64frombits(x.v.Swap(math.Float64bits(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped float64 into JSON.
|
|
||||||
func (x *Float64) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(x.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes a float64 from JSON.
|
|
||||||
func (x *Float64) UnmarshalJSON(b []byte) error {
|
|
||||||
var v float64
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
x.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
// Copyright (c) 2020-2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Float64 -type=float64 -wrapped=Uint64 -pack=math.Float64bits -unpack=math.Float64frombits -swap -json -imports math -file=float64.go
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped float64 and returns the new value.
|
|
||||||
func (f *Float64) Add(delta float64) float64 {
|
|
||||||
for {
|
|
||||||
old := f.Load()
|
|
||||||
new := old + delta
|
|
||||||
if f.CAS(old, new) {
|
|
||||||
return new
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped float64 and returns the new value.
|
|
||||||
func (f *Float64) Sub(delta float64) float64 {
|
|
||||||
return f.Add(-delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap for float64 values.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap
|
|
||||||
func (f *Float64) CAS(old, new float64) (swapped bool) {
|
|
||||||
return f.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for float64 values.
|
|
||||||
//
|
|
||||||
// Note: CompareAndSwap handles NaN incorrectly. NaN != NaN using Go's inbuilt operators
|
|
||||||
// but CompareAndSwap allows a stored NaN to compare equal to a passed in NaN.
|
|
||||||
// This avoids typical CompareAndSwap loops from blocking forever, e.g.,
|
|
||||||
//
|
|
||||||
// for {
|
|
||||||
// old := atom.Load()
|
|
||||||
// new = f(old)
|
|
||||||
// if atom.CompareAndSwap(old, new) {
|
|
||||||
// break
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// If CompareAndSwap did not match NaN to match, then the above would loop forever.
|
|
||||||
func (f *Float64) CompareAndSwap(old, new float64) (swapped bool) {
|
|
||||||
return f.v.CompareAndSwap(math.Float64bits(old), math.Float64bits(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (f *Float64) String() string {
|
|
||||||
// 'g' is the behavior for floats with %v.
|
|
||||||
return strconv.FormatFloat(f.Load(), 'g', -1, 64)
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicint -name=Int32 -wrapped=int32 -file=int32.go
|
|
||||||
//go:generate bin/gen-atomicint -name=Int64 -wrapped=int64 -file=int64.go
|
|
||||||
//go:generate bin/gen-atomicint -name=Uint32 -wrapped=uint32 -unsigned -file=uint32.go
|
|
||||||
//go:generate bin/gen-atomicint -name=Uint64 -wrapped=uint64 -unsigned -file=uint64.go
|
|
||||||
//go:generate bin/gen-atomicint -name=Uintptr -wrapped=uintptr -unsigned -file=uintptr.go
|
|
@ -1,109 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicint.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Int32 is an atomic wrapper around int32.
|
|
||||||
type Int32 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v int32
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt32 creates a new Int32.
|
|
||||||
func NewInt32(val int32) *Int32 {
|
|
||||||
return &Int32{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (i *Int32) Load() int32 {
|
|
||||||
return atomic.LoadInt32(&i.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped int32 and returns the new value.
|
|
||||||
func (i *Int32) Add(delta int32) int32 {
|
|
||||||
return atomic.AddInt32(&i.v, delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped int32 and returns the new value.
|
|
||||||
func (i *Int32) Sub(delta int32) int32 {
|
|
||||||
return atomic.AddInt32(&i.v, -delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inc atomically increments the wrapped int32 and returns the new value.
|
|
||||||
func (i *Int32) Inc() int32 {
|
|
||||||
return i.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dec atomically decrements the wrapped int32 and returns the new value.
|
|
||||||
func (i *Int32) Dec() int32 {
|
|
||||||
return i.Sub(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (i *Int32) CAS(old, new int32) (swapped bool) {
|
|
||||||
return i.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (i *Int32) CompareAndSwap(old, new int32) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapInt32(&i.v, old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (i *Int32) Store(val int32) {
|
|
||||||
atomic.StoreInt32(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped int32 and returns the old value.
|
|
||||||
func (i *Int32) Swap(val int32) (old int32) {
|
|
||||||
return atomic.SwapInt32(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped int32 into JSON.
|
|
||||||
func (i *Int32) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(i.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes JSON into the wrapped int32.
|
|
||||||
func (i *Int32) UnmarshalJSON(b []byte) error {
|
|
||||||
var v int32
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (i *Int32) String() string {
|
|
||||||
v := i.Load()
|
|
||||||
return strconv.FormatInt(int64(v), 10)
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicint.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Int64 is an atomic wrapper around int64.
|
|
||||||
type Int64 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v int64
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewInt64 creates a new Int64.
|
|
||||||
func NewInt64(val int64) *Int64 {
|
|
||||||
return &Int64{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (i *Int64) Load() int64 {
|
|
||||||
return atomic.LoadInt64(&i.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped int64 and returns the new value.
|
|
||||||
func (i *Int64) Add(delta int64) int64 {
|
|
||||||
return atomic.AddInt64(&i.v, delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped int64 and returns the new value.
|
|
||||||
func (i *Int64) Sub(delta int64) int64 {
|
|
||||||
return atomic.AddInt64(&i.v, -delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inc atomically increments the wrapped int64 and returns the new value.
|
|
||||||
func (i *Int64) Inc() int64 {
|
|
||||||
return i.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dec atomically decrements the wrapped int64 and returns the new value.
|
|
||||||
func (i *Int64) Dec() int64 {
|
|
||||||
return i.Sub(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (i *Int64) CAS(old, new int64) (swapped bool) {
|
|
||||||
return i.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (i *Int64) CompareAndSwap(old, new int64) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapInt64(&i.v, old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (i *Int64) Store(val int64) {
|
|
||||||
atomic.StoreInt64(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped int64 and returns the old value.
|
|
||||||
func (i *Int64) Swap(val int64) (old int64) {
|
|
||||||
return atomic.SwapInt64(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped int64 into JSON.
|
|
||||||
func (i *Int64) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(i.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes JSON into the wrapped int64.
|
|
||||||
func (i *Int64) UnmarshalJSON(b []byte) error {
|
|
||||||
var v int64
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (i *Int64) String() string {
|
|
||||||
v := i.Load()
|
|
||||||
return strconv.FormatInt(int64(v), 10)
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
// nocmp is an uncomparable struct. Embed this inside another struct to make
|
|
||||||
// it uncomparable.
|
|
||||||
//
|
|
||||||
// type Foo struct {
|
|
||||||
// nocmp
|
|
||||||
// // ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// This DOES NOT:
|
|
||||||
//
|
|
||||||
// - Disallow shallow copies of structs
|
|
||||||
// - Disallow comparison of pointers to uncomparable structs
|
|
||||||
type nocmp [0]func()
|
|
@ -1,31 +0,0 @@
|
|||||||
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
//go:build go1.18
|
|
||||||
// +build go1.18
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
// String returns a human readable representation of a Pointer's underlying value.
|
|
||||||
func (p *Pointer[T]) String() string {
|
|
||||||
return fmt.Sprint(p.Load())
|
|
||||||
}
|
|
@ -1,60 +0,0 @@
|
|||||||
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
//go:build go1.18 && !go1.19
|
|
||||||
// +build go1.18,!go1.19
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "unsafe"
|
|
||||||
|
|
||||||
type Pointer[T any] struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
p UnsafePointer
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPointer creates a new Pointer.
|
|
||||||
func NewPointer[T any](v *T) *Pointer[T] {
|
|
||||||
var p Pointer[T]
|
|
||||||
if v != nil {
|
|
||||||
p.p.Store(unsafe.Pointer(v))
|
|
||||||
}
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (p *Pointer[T]) Load() *T {
|
|
||||||
return (*T)(p.p.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (p *Pointer[T]) Store(val *T) {
|
|
||||||
p.p.Store(unsafe.Pointer(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped pointer and returns the old value.
|
|
||||||
func (p *Pointer[T]) Swap(val *T) (old *T) {
|
|
||||||
return (*T)(p.p.Swap(unsafe.Pointer(val)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) {
|
|
||||||
return p.p.CompareAndSwap(unsafe.Pointer(old), unsafe.Pointer(new))
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
//go:build go1.19
|
|
||||||
// +build go1.19
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "sync/atomic"
|
|
||||||
|
|
||||||
// Pointer is an atomic pointer of type *T.
|
|
||||||
type Pointer[T any] struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
p atomic.Pointer[T]
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewPointer creates a new Pointer.
|
|
||||||
func NewPointer[T any](v *T) *Pointer[T] {
|
|
||||||
var p Pointer[T]
|
|
||||||
if v != nil {
|
|
||||||
p.p.Store(v)
|
|
||||||
}
|
|
||||||
return &p
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (p *Pointer[T]) Load() *T {
|
|
||||||
return p.p.Load()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (p *Pointer[T]) Store(val *T) {
|
|
||||||
p.p.Store(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped pointer and returns the old value.
|
|
||||||
func (p *Pointer[T]) Swap(val *T) (old *T) {
|
|
||||||
return p.p.Swap(val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (p *Pointer[T]) CompareAndSwap(old, new *T) (swapped bool) {
|
|
||||||
return p.p.CompareAndSwap(old, new)
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicwrapper.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
// String is an atomic type-safe wrapper for string values.
|
|
||||||
type String struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v Value
|
|
||||||
}
|
|
||||||
|
|
||||||
var _zeroString string
|
|
||||||
|
|
||||||
// NewString creates a new String.
|
|
||||||
func NewString(val string) *String {
|
|
||||||
x := &String{}
|
|
||||||
if val != _zeroString {
|
|
||||||
x.Store(val)
|
|
||||||
}
|
|
||||||
return x
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped string.
|
|
||||||
func (x *String) Load() string {
|
|
||||||
return unpackString(x.v.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed string.
|
|
||||||
func (x *String) Store(val string) {
|
|
||||||
x.v.Store(packString(val))
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap for string values.
|
|
||||||
func (x *String) CompareAndSwap(old, new string) (swapped bool) {
|
|
||||||
if x.v.CompareAndSwap(packString(old), packString(new)) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if old == _zeroString {
|
|
||||||
// If the old value is the empty value, then it's possible the
|
|
||||||
// underlying Value hasn't been set and is nil, so retry with nil.
|
|
||||||
return x.v.CompareAndSwap(nil, packString(new))
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically stores the given string and returns the old
|
|
||||||
// value.
|
|
||||||
func (x *String) Swap(val string) (old string) {
|
|
||||||
return unpackString(x.v.Swap(packString(val)))
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=String -type=string -wrapped Value -pack packString -unpack unpackString -compareandswap -swap -file=string.go
|
|
||||||
|
|
||||||
func packString(s string) interface{} {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
func unpackString(v interface{}) string {
|
|
||||||
if s, ok := v.(string); ok {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns the wrapped value.
|
|
||||||
func (s *String) String() string {
|
|
||||||
return s.Load()
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalText encodes the wrapped string into a textual form.
|
|
||||||
//
|
|
||||||
// This makes it encodable as JSON, YAML, XML, and more.
|
|
||||||
func (s *String) MarshalText() ([]byte, error) {
|
|
||||||
return []byte(s.Load()), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalText decodes text and replaces the wrapped string with it.
|
|
||||||
//
|
|
||||||
// This makes it decodable from JSON, YAML, XML, and more.
|
|
||||||
func (s *String) UnmarshalText(b []byte) error {
|
|
||||||
s.Store(string(b))
|
|
||||||
return nil
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
// Copyright (c) 2021 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
//go:generate bin/gen-atomicwrapper -name=Time -type=time.Time -wrapped=Value -pack=packTime -unpack=unpackTime -imports time -file=time.go
|
|
||||||
|
|
||||||
func packTime(t time.Time) interface{} {
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
func unpackTime(v interface{}) time.Time {
|
|
||||||
if t, ok := v.(time.Time); ok {
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
return time.Time{}
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicint.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Uint32 is an atomic wrapper around uint32.
|
|
||||||
type Uint32 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUint32 creates a new Uint32.
|
|
||||||
func NewUint32(val uint32) *Uint32 {
|
|
||||||
return &Uint32{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (i *Uint32) Load() uint32 {
|
|
||||||
return atomic.LoadUint32(&i.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped uint32 and returns the new value.
|
|
||||||
func (i *Uint32) Add(delta uint32) uint32 {
|
|
||||||
return atomic.AddUint32(&i.v, delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped uint32 and returns the new value.
|
|
||||||
func (i *Uint32) Sub(delta uint32) uint32 {
|
|
||||||
return atomic.AddUint32(&i.v, ^(delta - 1))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inc atomically increments the wrapped uint32 and returns the new value.
|
|
||||||
func (i *Uint32) Inc() uint32 {
|
|
||||||
return i.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dec atomically decrements the wrapped uint32 and returns the new value.
|
|
||||||
func (i *Uint32) Dec() uint32 {
|
|
||||||
return i.Sub(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (i *Uint32) CAS(old, new uint32) (swapped bool) {
|
|
||||||
return i.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (i *Uint32) CompareAndSwap(old, new uint32) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapUint32(&i.v, old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (i *Uint32) Store(val uint32) {
|
|
||||||
atomic.StoreUint32(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped uint32 and returns the old value.
|
|
||||||
func (i *Uint32) Swap(val uint32) (old uint32) {
|
|
||||||
return atomic.SwapUint32(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped uint32 into JSON.
|
|
||||||
func (i *Uint32) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(i.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes JSON into the wrapped uint32.
|
|
||||||
func (i *Uint32) UnmarshalJSON(b []byte) error {
|
|
||||||
var v uint32
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (i *Uint32) String() string {
|
|
||||||
v := i.Load()
|
|
||||||
return strconv.FormatUint(uint64(v), 10)
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicint.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Uint64 is an atomic wrapper around uint64.
|
|
||||||
type Uint64 struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUint64 creates a new Uint64.
|
|
||||||
func NewUint64(val uint64) *Uint64 {
|
|
||||||
return &Uint64{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (i *Uint64) Load() uint64 {
|
|
||||||
return atomic.LoadUint64(&i.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped uint64 and returns the new value.
|
|
||||||
func (i *Uint64) Add(delta uint64) uint64 {
|
|
||||||
return atomic.AddUint64(&i.v, delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped uint64 and returns the new value.
|
|
||||||
func (i *Uint64) Sub(delta uint64) uint64 {
|
|
||||||
return atomic.AddUint64(&i.v, ^(delta - 1))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inc atomically increments the wrapped uint64 and returns the new value.
|
|
||||||
func (i *Uint64) Inc() uint64 {
|
|
||||||
return i.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dec atomically decrements the wrapped uint64 and returns the new value.
|
|
||||||
func (i *Uint64) Dec() uint64 {
|
|
||||||
return i.Sub(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (i *Uint64) CAS(old, new uint64) (swapped bool) {
|
|
||||||
return i.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (i *Uint64) CompareAndSwap(old, new uint64) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapUint64(&i.v, old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (i *Uint64) Store(val uint64) {
|
|
||||||
atomic.StoreUint64(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped uint64 and returns the old value.
|
|
||||||
func (i *Uint64) Swap(val uint64) (old uint64) {
|
|
||||||
return atomic.SwapUint64(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped uint64 into JSON.
|
|
||||||
func (i *Uint64) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(i.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes JSON into the wrapped uint64.
|
|
||||||
func (i *Uint64) UnmarshalJSON(b []byte) error {
|
|
||||||
var v uint64
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (i *Uint64) String() string {
|
|
||||||
v := i.Load()
|
|
||||||
return strconv.FormatUint(uint64(v), 10)
|
|
||||||
}
|
|
@ -1,109 +0,0 @@
|
|||||||
// @generated Code generated by gen-atomicint.
|
|
||||||
|
|
||||||
// Copyright (c) 2020-2023 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"sync/atomic"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Uintptr is an atomic wrapper around uintptr.
|
|
||||||
type Uintptr struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v uintptr
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUintptr creates a new Uintptr.
|
|
||||||
func NewUintptr(val uintptr) *Uintptr {
|
|
||||||
return &Uintptr{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (i *Uintptr) Load() uintptr {
|
|
||||||
return atomic.LoadUintptr(&i.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add atomically adds to the wrapped uintptr and returns the new value.
|
|
||||||
func (i *Uintptr) Add(delta uintptr) uintptr {
|
|
||||||
return atomic.AddUintptr(&i.v, delta)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub atomically subtracts from the wrapped uintptr and returns the new value.
|
|
||||||
func (i *Uintptr) Sub(delta uintptr) uintptr {
|
|
||||||
return atomic.AddUintptr(&i.v, ^(delta - 1))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inc atomically increments the wrapped uintptr and returns the new value.
|
|
||||||
func (i *Uintptr) Inc() uintptr {
|
|
||||||
return i.Add(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dec atomically decrements the wrapped uintptr and returns the new value.
|
|
||||||
func (i *Uintptr) Dec() uintptr {
|
|
||||||
return i.Sub(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap.
|
|
||||||
func (i *Uintptr) CAS(old, new uintptr) (swapped bool) {
|
|
||||||
return i.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (i *Uintptr) CompareAndSwap(old, new uintptr) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapUintptr(&i.v, old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (i *Uintptr) Store(val uintptr) {
|
|
||||||
atomic.StoreUintptr(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped uintptr and returns the old value.
|
|
||||||
func (i *Uintptr) Swap(val uintptr) (old uintptr) {
|
|
||||||
return atomic.SwapUintptr(&i.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MarshalJSON encodes the wrapped uintptr into JSON.
|
|
||||||
func (i *Uintptr) MarshalJSON() ([]byte, error) {
|
|
||||||
return json.Marshal(i.Load())
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnmarshalJSON decodes JSON into the wrapped uintptr.
|
|
||||||
func (i *Uintptr) UnmarshalJSON(b []byte) error {
|
|
||||||
var v uintptr
|
|
||||||
if err := json.Unmarshal(b, &v); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
i.Store(v)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String encodes the wrapped value as a string.
|
|
||||||
func (i *Uintptr) String() string {
|
|
||||||
v := i.Load()
|
|
||||||
return strconv.FormatUint(uint64(v), 10)
|
|
||||||
}
|
|
@ -1,65 +0,0 @@
|
|||||||
// Copyright (c) 2021-2022 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import (
|
|
||||||
"sync/atomic"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
// UnsafePointer is an atomic wrapper around unsafe.Pointer.
|
|
||||||
type UnsafePointer struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
v unsafe.Pointer
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewUnsafePointer creates a new UnsafePointer.
|
|
||||||
func NewUnsafePointer(val unsafe.Pointer) *UnsafePointer {
|
|
||||||
return &UnsafePointer{v: val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load atomically loads the wrapped value.
|
|
||||||
func (p *UnsafePointer) Load() unsafe.Pointer {
|
|
||||||
return atomic.LoadPointer(&p.v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Store atomically stores the passed value.
|
|
||||||
func (p *UnsafePointer) Store(val unsafe.Pointer) {
|
|
||||||
atomic.StorePointer(&p.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Swap atomically swaps the wrapped unsafe.Pointer and returns the old value.
|
|
||||||
func (p *UnsafePointer) Swap(val unsafe.Pointer) (old unsafe.Pointer) {
|
|
||||||
return atomic.SwapPointer(&p.v, val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CAS is an atomic compare-and-swap.
|
|
||||||
//
|
|
||||||
// Deprecated: Use CompareAndSwap
|
|
||||||
func (p *UnsafePointer) CAS(old, new unsafe.Pointer) (swapped bool) {
|
|
||||||
return p.CompareAndSwap(old, new)
|
|
||||||
}
|
|
||||||
|
|
||||||
// CompareAndSwap is an atomic compare-and-swap.
|
|
||||||
func (p *UnsafePointer) CompareAndSwap(old, new unsafe.Pointer) (swapped bool) {
|
|
||||||
return atomic.CompareAndSwapPointer(&p.v, old, new)
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
// Copyright (c) 2020 Uber Technologies, Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and associated documentation files (the "Software"), to deal
|
|
||||||
// in the Software without restriction, including without limitation the rights
|
|
||||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
// copies of the Software, and to permit persons to whom the Software is
|
|
||||||
// furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Software.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
// THE SOFTWARE.
|
|
||||||
|
|
||||||
package atomic
|
|
||||||
|
|
||||||
import "sync/atomic"
|
|
||||||
|
|
||||||
// Value shadows the type of the same name from sync/atomic
|
|
||||||
// https://godoc.org/sync/atomic#Value
|
|
||||||
type Value struct {
|
|
||||||
_ nocmp // disallow non-atomic comparison
|
|
||||||
|
|
||||||
atomic.Value
|
|
||||||
}
|
|
51
vendor/go.uber.org/atomic/time.go → vendor/go.uber.org/zap/internal/pool/pool.go
generated
vendored
51
vendor/go.uber.org/atomic/time.go → vendor/go.uber.org/zap/internal/pool/pool.go
generated
vendored
@ -0,0 +1,44 @@
|
|||||||
|
// 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 slices
|
||||||
|
|
||||||
|
import "golang.org/x/exp/constraints"
|
||||||
|
|
||||||
|
// min is a version of the predeclared function from the Go 1.21 release.
|
||||||
|
func min[T constraints.Ordered](a, b T) T {
|
||||||
|
if a < b || isNaN(a) {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// max is a version of the predeclared function from the Go 1.21 release.
|
||||||
|
func max[T constraints.Ordered](a, b T) T {
|
||||||
|
if a > b || isNaN(a) {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// cmpLess is a copy of cmp.Less from the Go 1.21 release.
|
||||||
|
func cmpLess[T constraints.Ordered](x, y T) bool {
|
||||||
|
return (isNaN(x) && !isNaN(y)) || x < y
|
||||||
|
}
|
||||||
|
|
||||||
|
// cmpCompare is a copy of cmp.Compare from the Go 1.21 release.
|
||||||
|
func cmpCompare[T constraints.Ordered](x, y T) int {
|
||||||
|
xNaN := isNaN(x)
|
||||||
|
yNaN := isNaN(y)
|
||||||
|
if xNaN && yNaN {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if xNaN || x < y {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
if yNaN || x > y {
|
||||||
|
return +1
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
154
vendor/golang.org/x/exp/slices/zsortfunc.go → vendor/golang.org/x/exp/slices/zsortanyfunc.go
generated
vendored
154
vendor/golang.org/x/exp/slices/zsortfunc.go → vendor/golang.org/x/exp/slices/zsortanyfunc.go
generated
vendored
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue