tls: document package and guard helpers
This commit is contained in:
@@ -40,9 +40,17 @@ func Realloc(ptr c.Pointer, size uintptr) c.Pointer
|
|||||||
//go:linkname Free C.GC_free
|
//go:linkname Free C.GC_free
|
||||||
func Free(ptr c.Pointer)
|
func Free(ptr c.Pointer)
|
||||||
|
|
||||||
|
// AddRoots registers a memory region [start, end) as a GC root. The caller
|
||||||
|
// must ensure that the range remains valid until RemoveRoots is invoked with
|
||||||
|
// the same boundaries. This is typically used for TLS slots that store Go
|
||||||
|
// pointers.
|
||||||
|
//
|
||||||
//go:linkname AddRoots C.GC_add_roots
|
//go:linkname AddRoots C.GC_add_roots
|
||||||
func AddRoots(start, end c.Pointer)
|
func AddRoots(start, end c.Pointer)
|
||||||
|
|
||||||
|
// RemoveRoots unregisters a region previously registered with AddRoots. The
|
||||||
|
// start and end pointers must exactly match the earlier AddRoots call.
|
||||||
|
//
|
||||||
//go:linkname RemoveRoots C.GC_remove_roots
|
//go:linkname RemoveRoots C.GC_remove_roots
|
||||||
func RemoveRoots(start, end c.Pointer)
|
func RemoveRoots(start, end c.Pointer)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,45 @@
|
|||||||
//go:build llgo
|
//go:build llgo
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025 The GoPlus Authors (goplus.org). All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package tls provides generic thread-local storage backed by POSIX pthread
|
||||||
|
// TLS. When built with the GC-enabled configuration (llgo && !nogc), TLS slots
|
||||||
|
// are automatically registered with the BDWGC garbage collector so pointers
|
||||||
|
// stored in thread-local state remain visible to the collector. Builds without
|
||||||
|
// GC integration (llgo && nogc) simply fall back to pthread TLS without root
|
||||||
|
// registration.
|
||||||
|
//
|
||||||
|
// Basic usage:
|
||||||
|
//
|
||||||
|
// h := tls.Alloc[int](nil)
|
||||||
|
// h.Set(42)
|
||||||
|
// val := h.Get() // returns 42
|
||||||
|
//
|
||||||
|
// With destructor:
|
||||||
|
//
|
||||||
|
// h := tls.Alloc[*Resource](func(r **Resource) {
|
||||||
|
// if r != nil && *r != nil {
|
||||||
|
// (*r).Close()
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// Build tags:
|
||||||
|
// - llgo && !nogc: Enables GC-aware slot registration via BDWGC
|
||||||
|
// - llgo && nogc: Disables GC integration; TLS acts as plain pthread TLS
|
||||||
package tls
|
package tls
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
//go:build llgo && !nogc
|
//go:build llgo && !nogc
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025 The GoPlus Authors (goplus.org). All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
package tls
|
package tls
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -48,6 +64,11 @@ func deregisterSlot[T any](s *slot[T]) {
|
|||||||
|
|
||||||
func (s *slot[T]) rootRange() (start, end c.Pointer) {
|
func (s *slot[T]) rootRange() (start, end c.Pointer) {
|
||||||
begin := unsafe.Pointer(s)
|
begin := unsafe.Pointer(s)
|
||||||
endPtr := unsafe.Pointer(uintptr(begin) + unsafe.Sizeof(*s))
|
size := unsafe.Sizeof(*s)
|
||||||
|
beginAddr := uintptr(begin)
|
||||||
|
if beginAddr > ^uintptr(0)-size {
|
||||||
|
panic("tls: pointer arithmetic overflow in rootRange")
|
||||||
|
}
|
||||||
|
endPtr := unsafe.Pointer(beginAddr + size)
|
||||||
return c.Pointer(begin), c.Pointer(endPtr)
|
return c.Pointer(begin), c.Pointer(endPtr)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
//go:build llgo && nogc
|
//go:build llgo && nogc
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025 The GoPlus Authors (goplus.org). All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
package tls
|
package tls
|
||||||
|
|
||||||
type slot[T any] struct {
|
type slot[T any] struct {
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
//go:build llgo
|
//go:build llgo
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025 The GoPlus Authors (goplus.org). All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
package tls_test
|
package tls_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,5 +1,21 @@
|
|||||||
//go:build !llgo
|
//go:build !llgo
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2025 The GoPlus Authors (goplus.org). All rights reserved.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
package ssa
|
package ssa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
Reference in New Issue
Block a user