runtime: support Goexit

This commit is contained in:
visualfc
2025-02-16 08:21:58 +08:00
parent e74d2b45c0
commit 6d7e984238
3 changed files with 31 additions and 3 deletions

View File

@@ -56,6 +56,20 @@ func Exit(retval c.Pointer)
//go:linkname Cancel C.pthread_cancel
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.

View File

@@ -31,7 +31,7 @@ import "C"
import (
"unsafe"
"github.com/goplus/llgo/runtime/internal/clite/pthread"
"github.com/goplus/llgo/runtime/internal/runtime"
)
// llgo:skipall
@@ -52,7 +52,7 @@ func GOMAXPROCS(n int) int {
}
func Goexit() {
pthread.Exit(nil)
runtime.Goexit()
}
func KeepAlive(x any) {

View File

@@ -78,17 +78,31 @@ func Rethrow(link *Defer) {
}
var (
excepKey pthread.Key
excepKey pthread.Key
mainThread pthread.Thread
goexit struct{}
)
func Goexit() {
panic(goexit)
}
func init() {
excepKey.Create(nil)
mainThread = pthread.Self()
}
// -----------------------------------------------------------------------------
// TracePanic prints panic message.
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: ")
printany(v)
println("\n")