diff options
Diffstat (limited to 'vendor/github.com/bytedance/sonic/loader')
5 files changed, 34 insertions, 15 deletions
diff --git a/vendor/github.com/bytedance/sonic/loader/funcdata_go121.go b/vendor/github.com/bytedance/sonic/loader/funcdata_go121.go index f50663e2a..ebeaca5a7 100644 --- a/vendor/github.com/bytedance/sonic/loader/funcdata_go121.go +++ b/vendor/github.com/bytedance/sonic/loader/funcdata_go121.go @@ -1,5 +1,5 @@ -//go:build go1.21 && !go1.22 -// +build go1.21,!go1.22 +//go:build go1.21 && !go1.23 +// +build go1.21,!go1.23 /* * Copyright 2021 ByteDance Inc. diff --git a/vendor/github.com/bytedance/sonic/loader/funcdata_latest.go b/vendor/github.com/bytedance/sonic/loader/funcdata_latest.go index 52c6097fb..08618dca4 100644 --- a/vendor/github.com/bytedance/sonic/loader/funcdata_latest.go +++ b/vendor/github.com/bytedance/sonic/loader/funcdata_latest.go @@ -1,5 +1,5 @@ -// go:build go1.18 && !go1.22 -// +build go1.18,!go1.22 +// go:build go1.18 && !go1.23 +// +build go1.18,!go1.23 /* * Copyright 2021 ByteDance Inc. diff --git a/vendor/github.com/bytedance/sonic/loader/loader_latest.go b/vendor/github.com/bytedance/sonic/loader/loader_latest.go index b6e3e75f8..3664c04ba 100644 --- a/vendor/github.com/bytedance/sonic/loader/loader_latest.go +++ b/vendor/github.com/bytedance/sonic/loader/loader_latest.go @@ -1,5 +1,4 @@ -//go:build go1.16 && !go1.22 -// +build go1.16,!go1.22 +// +build go1.16,!go1.23 /* * Copyright 2021 ByteDance Inc. diff --git a/vendor/github.com/bytedance/sonic/loader/mmap_unix.go b/vendor/github.com/bytedance/sonic/loader/mmap_unix.go index 3ea944ed6..26bdb6584 100644 --- a/vendor/github.com/bytedance/sonic/loader/mmap_unix.go +++ b/vendor/github.com/bytedance/sonic/loader/mmap_unix.go @@ -1,5 +1,5 @@ -//go:build darwin || linux -// +build darwin linux +//go:build !windows +// +build !windows /** * Copyright 2023 ByteDance Inc. diff --git a/vendor/github.com/bytedance/sonic/loader/stubs.go b/vendor/github.com/bytedance/sonic/loader/stubs.go index 8377649b7..80f8de836 100644 --- a/vendor/github.com/bytedance/sonic/loader/stubs.go +++ b/vendor/github.com/bytedance/sonic/loader/stubs.go @@ -17,7 +17,8 @@ package loader import ( - `sync` + "sync/atomic" + "unsafe" _ `unsafe` ) @@ -25,16 +26,35 @@ import ( //goland:noinspection GoUnusedGlobalVariable var lastmoduledatap *moduledata -var moduledataMux sync.Mutex - func registerModule(mod *moduledata) { - moduledataMux.Lock() - lastmoduledatap.next = mod - lastmoduledatap = mod - moduledataMux.Unlock() + registerModuleLockFree(&lastmoduledatap, mod) } //go:linkname moduledataverify1 runtime.moduledataverify1 func moduledataverify1(_ *moduledata) +func registerModuleLockFree(tail **moduledata, mod *moduledata) { + for { + oldTail := loadModule(tail) + if casModule(tail, oldTail, mod) { + storeModule(&oldTail.next, mod) + break + } + } +} + +func loadModule(p **moduledata) *moduledata { + return (*moduledata)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func storeModule(p **moduledata, value *moduledata) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(value)) +} + +func casModule(p **moduledata, oldValue *moduledata, newValue *moduledata) bool { + return atomic.CompareAndSwapPointer( + (*unsafe.Pointer)(unsafe.Pointer(p)), + unsafe.Pointer(oldValue), + unsafe.Pointer(newValue), + ) +} |