@@ -56,6 +56,20 @@ func Exit(retval c.Pointer)
|
|||||||
//go:linkname Cancel C.pthread_cancel
|
//go:linkname Cancel C.pthread_cancel
|
||||||
func Cancel(thread Thread) c.Int
|
func Cancel(thread Thread) c.Int
|
||||||
|
|
||||||
|
// The pthread_self() function returns the ID of the calling thread.
|
||||||
|
// This is the same value that is returned in *thread in the
|
||||||
|
// pthread_create(3) call that created this thread.
|
||||||
|
//
|
||||||
|
//go:linkname Self C.pthread_self
|
||||||
|
func Self() Thread
|
||||||
|
|
||||||
|
// The pthread_equal() function compares two thread identifiers.
|
||||||
|
// If the two thread IDs are equal, pthread_equal() returns a nonzero
|
||||||
|
// value; otherwise, it returns 0.
|
||||||
|
//
|
||||||
|
//go:linkname Equal C.pthread_equal
|
||||||
|
func Equal(t1, t2 Thread) c.Int
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
// Attr represents a POSIX thread attributes.
|
// Attr represents a POSIX thread attributes.
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import "C"
|
|||||||
import (
|
import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/goplus/llgo/runtime/internal/clite/pthread"
|
"github.com/goplus/llgo/runtime/internal/runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// llgo:skipall
|
// llgo:skipall
|
||||||
@@ -52,7 +52,7 @@ func GOMAXPROCS(n int) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Goexit() {
|
func Goexit() {
|
||||||
pthread.Exit(nil)
|
runtime.Goexit()
|
||||||
}
|
}
|
||||||
|
|
||||||
func KeepAlive(x any) {
|
func KeepAlive(x any) {
|
||||||
|
|||||||
@@ -78,17 +78,31 @@ func Rethrow(link *Defer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
excepKey pthread.Key
|
excepKey pthread.Key
|
||||||
|
mainThread pthread.Thread
|
||||||
|
goexit struct{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func Goexit() {
|
||||||
|
panic(goexit)
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
excepKey.Create(nil)
|
excepKey.Create(nil)
|
||||||
|
mainThread = pthread.Self()
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
// TracePanic prints panic message.
|
// TracePanic prints panic message.
|
||||||
func TracePanic(v any) {
|
func TracePanic(v any) {
|
||||||
|
if v == goexit {
|
||||||
|
if pthread.Equal(mainThread, pthread.Self()) != 0 {
|
||||||
|
fatal("no goroutines (main called runtime.Goexit) - deadlock!")
|
||||||
|
c.Exit(2)
|
||||||
|
}
|
||||||
|
pthread.Exit(nil)
|
||||||
|
}
|
||||||
print("panic: ")
|
print("panic: ")
|
||||||
printany(v)
|
printany(v)
|
||||||
println("\n")
|
println("\n")
|
||||||
|
|||||||
Reference in New Issue
Block a user