mirror of
https://github.com/zrepl/zrepl.git
synced 2025-01-19 04:38:25 +01:00
def510abfd
Go upgrade: - Go 1.23 is current => use that for release builds - Go 1.22 is less than one year old, it's desirable to support it. - The [`Go Toolchains`](https://go.dev/doc/toolchain) stuff is available in both of these (would also be in Go 1.21). That is quite nice stuff, but required some changes to how we versions we use in CircleCI and the `release-docker` Makefile target. Protobuf upgrade: - Go to protobuf GH release website - Download latest locally - run `sha256sum` - replace existing pinned hashes - `make generate` Deps upgrade: - `go get -t -u all` - repository moves aren't handled well automatically, fix manually - repeat until no changes
54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
package trace
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/bits-and-blooms/bitset"
|
|
)
|
|
|
|
type uniqueConcurrentTaskNamer struct {
|
|
mtx sync.Mutex
|
|
active map[string]*bitset.BitSet
|
|
}
|
|
|
|
// bitvecLengthGauge may be nil
|
|
func newUniqueTaskNamer() *uniqueConcurrentTaskNamer {
|
|
return &uniqueConcurrentTaskNamer{
|
|
active: make(map[string]*bitset.BitSet),
|
|
}
|
|
}
|
|
|
|
// appends `#%d` to `name` such that until `done` is called,
|
|
// it is guaranteed that `#%d` is not returned a second time for the same `name`
|
|
func (namer *uniqueConcurrentTaskNamer) UniqueConcurrentTaskName(name string) (uniqueName string, done func()) {
|
|
if strings.Contains(name, "#") {
|
|
panic(name)
|
|
}
|
|
namer.mtx.Lock()
|
|
act, ok := namer.active[name]
|
|
if !ok {
|
|
act = bitset.New(64) // FIXME magic const
|
|
namer.active[name] = act
|
|
}
|
|
id, ok := act.NextClear(0)
|
|
if !ok {
|
|
// if !ok, all bits are 1 and act.Len() returns the next bit
|
|
id = act.Len()
|
|
// FIXME unbounded growth without reclamation
|
|
}
|
|
act.Set(id)
|
|
namer.mtx.Unlock()
|
|
|
|
return fmt.Sprintf("%s#%d", name, id), func() {
|
|
namer.mtx.Lock()
|
|
defer namer.mtx.Unlock()
|
|
act, ok := namer.active[name]
|
|
if !ok {
|
|
panic("must be initialized upon entry")
|
|
}
|
|
act.Clear(id)
|
|
}
|
|
}
|