Files
next.orly.dev/pkg/utils/atomic/README.md
mleku e56bf76257
Some checks failed
Go / build (push) Has been cancelled
Go / release (push) Has been cancelled
Add NIP-11 relay synchronization and group management features
- Introduced a new `sync` package for managing NIP-11 relay information and relay group configurations.
- Implemented a cache for NIP-11 documents, allowing retrieval of relay public keys and authoritative configurations.
- Enhanced the sync manager to update peer lists based on authoritative configurations from relay group events.
- Updated event handling to incorporate policy checks during event imports, ensuring compliance with relay rules.
- Refactored various components to utilize the new `sha256-simd` package for improved performance.
- Added comprehensive tests to validate the new synchronization and group management functionalities.
- Bumped version to v0.24.1 to reflect these changes.
2025-11-03 18:17:15 +00:00

175 lines
3.8 KiB
Markdown

# atomic
Type-safe atomic operations for Go primitive types. This package provides convenient wrappers around Go's `sync/atomic` package to ensure safe concurrent access to shared variables.
## Features
- **Type Safety**: Strongly typed wrappers prevent accidental misuse
- **Memory Safety**: Prevents race conditions in concurrent programs
- **Performance**: Zero-overhead wrappers around standard library atomics
- **Comprehensive Coverage**: Supports all common primitive types
- **Thread Safe**: All operations are atomic and safe for concurrent access
## Installation
```bash
go get next.orly.dev/pkg/utils/atomic
```
## Usage
The atomic package provides type-safe wrappers around Go's standard `sync/atomic` operations:
### Basic Operations
```go
import "next.orly.dev/pkg/utils/atomic"
// Integer types
var counter atomic.Uint64
counter.Store(42)
value := counter.Load() // 42
counter.Add(8) // 50
// Boolean operations
var flag atomic.Bool
flag.Store(true)
if flag.Load() {
// Handle true case
}
// Pointer operations
var ptr atomic.Pointer[string]
ptr.Store(&someString)
loadedPtr := ptr.Load()
```
### Advanced Operations
```go
// Compare and swap
var value atomic.Int64
value.Store(100)
swapped := value.CompareAndSwap(100, 200) // true, value is now 200
// Swap operations
oldValue := value.Swap(300) // oldValue = 200, new value = 300
// Atomic add/subtract
delta := value.Add(50) // Add 50, return new value (350)
value.Sub(25) // Subtract 25, value is now 325
```
### Supported Types
| Type | Description |
|------|-------------|
| `Bool` | Atomic boolean operations |
| `Int32` | 32-bit signed integer |
| `Int64` | 64-bit signed integer |
| `Uint32` | 32-bit unsigned integer |
| `Uint64` | 64-bit unsigned integer |
| `Uintptr` | Pointer-sized unsigned integer |
| `Float64` | 64-bit floating point |
| `Pointer[T]` | Generic pointer type |
### Generic Pointer Example
```go
// Type-safe pointer operations
var config atomic.Pointer[Config]
config.Store(&myConfig)
// Load with type safety
currentConfig := config.Load()
if currentConfig != nil {
// Use config with full type safety
}
```
## API Reference
All atomic types implement a consistent interface:
- `Load() T` - Atomically load the current value
- `Store(val T)` - Atomically store a new value
- `Swap(new T) T` - Atomically swap values, return old value
- `CompareAndSwap(old, new T) bool` - CAS operation
Additional methods by type:
**Integer Types (Int32, Int64, Uint32, Uint64):**
- `Add(delta T) T` - Atomically add delta, return new value
- `Sub(delta T) T` - Atomically subtract delta, return new value
**Float64:**
- `Add(delta float64) float64` - Atomically add delta
## Testing
The atomic package includes comprehensive tests:
### Running Tests
```bash
# Run atomic package tests
go test ./pkg/utils/atomic
# Run with verbose output
go test -v ./pkg/utils/atomic
# Run with race detection
go test -race ./pkg/utils/atomic
# Run with coverage
go test -cover ./pkg/utils/atomic
```
### Integration Testing
Part of the full test suite:
```bash
# Run all tests including atomic
./scripts/test.sh
# Run specific package tests
go test ./pkg/utils/...
```
### Test Coverage
Tests cover:
- All atomic operations
- Concurrent access patterns
- Race condition prevention
- Type safety
- Memory ordering guarantees
## Performance
The atomic wrappers have zero runtime overhead compared to direct `sync/atomic` calls. The Go compiler inlines all wrapper methods, resulting in identical generated code.
## Development
### Building
```bash
go build ./pkg/utils/atomic
```
### Code Quality
- Full test coverage with race detection
- Go best practices compliance
- Comprehensive documentation
- Thread-safe by design
## Examples
See the test files for comprehensive usage examples and edge cases.
## License
Part of the next.orly.dev project. See main LICENSE file.