make runtime compatible with wasm
This commit is contained in:
181
runtime/internal/test/test.go
Normal file
181
runtime/internal/test/test.go
Normal file
@@ -0,0 +1,181 @@
|
||||
package test
|
||||
|
||||
/*
|
||||
#include <time.h>
|
||||
#include <pthread.h>
|
||||
#include <setjmp.h>
|
||||
#include <sys/types.h>
|
||||
*/
|
||||
import "C"
|
||||
import (
|
||||
"runtime"
|
||||
"unsafe"
|
||||
|
||||
_ "github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
var mode C.mode_t
|
||||
var uid C.uid_t
|
||||
var gid C.gid_t
|
||||
var off C.off_t
|
||||
var dev C.dev_t
|
||||
|
||||
var once C.pthread_once_t
|
||||
var mutex C.pthread_mutex_t
|
||||
var cond C.pthread_cond_t
|
||||
var rwlock C.pthread_rwlock_t
|
||||
var mutexattr C.pthread_mutexattr_t
|
||||
var condattr C.pthread_condattr_t
|
||||
var rwlockattr C.pthread_rwlockattr_t
|
||||
var clock C.clock_t
|
||||
var sigjmpbuf C.sigjmp_buf
|
||||
var jmpbuf C.jmp_buf
|
||||
|
||||
const (
|
||||
// Real sizes from the current platform
|
||||
pthreadOnceSizeReal = unsafe.Sizeof(once)
|
||||
pthreadMutexSizeReal = unsafe.Sizeof(mutex)
|
||||
pthreadMutexAttrSizeReal = unsafe.Sizeof(mutexattr)
|
||||
pthreadCondSizeReal = unsafe.Sizeof(cond)
|
||||
pthreadCondAttrSizeReal = unsafe.Sizeof(condattr)
|
||||
pthreadRWLockSizeReal = unsafe.Sizeof(rwlock)
|
||||
pthreadRWLockAttrSizeReal = unsafe.Sizeof(rwlockattr)
|
||||
clockSizeReal = unsafe.Sizeof(clock)
|
||||
sigjmpBufSizeReal = unsafe.Sizeof(sigjmpbuf)
|
||||
jmpBufSizeReal = unsafe.Sizeof(jmpbuf)
|
||||
)
|
||||
|
||||
// Linux amd64 specific sizes
|
||||
var linuxAmd64 = runtime.GOOS == "linux" && runtime.GOARCH == "amd64"
|
||||
|
||||
// Linux arm64 specific sizes
|
||||
var linuxArm64 = runtime.GOOS == "linux" && runtime.GOARCH == "arm64"
|
||||
|
||||
// macOS amd64 specific sizes
|
||||
var darwinAmd64 = runtime.GOOS == "darwin" && runtime.GOARCH == "amd64"
|
||||
|
||||
// macOS arm64 specific sizes
|
||||
var darwinArm64 = runtime.GOOS == "darwin" && runtime.GOARCH == "arm64"
|
||||
|
||||
const (
|
||||
// Linux amd64 pthread sizes
|
||||
pthreadOnceSizeLinuxAmd64 = 4
|
||||
pthreadMutexSizeLinuxAmd64 = 40
|
||||
pthreadMutexAttrSizeLinuxAmd64 = 4
|
||||
pthreadCondSizeLinuxAmd64 = 48
|
||||
pthreadCondAttrSizeLinuxAmd64 = 4
|
||||
pthreadRWLockSizeLinuxAmd64 = 56
|
||||
pthreadRWLockAttrSizeLinuxAmd64 = 8
|
||||
clockSizeLinuxAmd64 = 8
|
||||
sigjmpBufSizeLinuxAmd64 = 200
|
||||
jmpBufSizeLinuxAmd64 = 200
|
||||
|
||||
// Linux arm64 pthread sizes
|
||||
pthreadOnceSizeLinuxArm64 = 4
|
||||
pthreadMutexSizeLinuxArm64 = 48
|
||||
pthreadMutexAttrSizeLinuxArm64 = 8
|
||||
pthreadCondSizeLinuxArm64 = 48
|
||||
pthreadCondAttrSizeLinuxArm64 = 8
|
||||
pthreadRWLockSizeLinuxArm64 = 56
|
||||
pthreadRWLockAttrSizeLinuxArm64 = 8
|
||||
clockSizeLinuxArm64 = 8
|
||||
sigjmpBufSizeLinuxArm64 = 312
|
||||
jmpBufSizeLinuxArm64 = 312
|
||||
|
||||
// macOS amd64 pthread sizes
|
||||
pthreadOnceSizeDarwinAmd64 = 16
|
||||
pthreadMutexSizeDarwinAmd64 = 56
|
||||
pthreadMutexAttrSizeDarwinAmd64 = 8
|
||||
pthreadCondSizeDarwinAmd64 = 40
|
||||
pthreadCondAttrSizeDarwinAmd64 = 8
|
||||
pthreadRWLockSizeDarwinAmd64 = 192
|
||||
pthreadRWLockAttrSizeDarwinAmd64 = 16
|
||||
clockSizeDarwinAmd64 = 8
|
||||
sigjmpBufSizeDarwinAmd64 = 196
|
||||
jmpBufSizeDarwinAmd64 = 196
|
||||
|
||||
// macOS arm64 pthread sizes
|
||||
pthreadOnceSizeDarwinArm64 = 16
|
||||
pthreadMutexSizeDarwinArm64 = 64
|
||||
pthreadMutexAttrSizeDarwinArm64 = 16
|
||||
pthreadCondSizeDarwinArm64 = 48
|
||||
pthreadCondAttrSizeDarwinArm64 = 16
|
||||
pthreadRWLockSizeDarwinArm64 = 200
|
||||
pthreadRWLockAttrSizeDarwinArm64 = 24
|
||||
clockSizeDarwinArm64 = 8
|
||||
sigjmpBufSizeDarwinArm64 = 196
|
||||
jmpBufSizeDarwinArm64 = 192
|
||||
)
|
||||
|
||||
// Get architecture-specific pthread sizes based on the current platform
|
||||
func getPlatformPthreadSizes() (onceSize, mutexSize, mutexAttrSize, condSize, condAttrSize, rwlockSize, rwlockAttrSize int) {
|
||||
switch {
|
||||
case linuxAmd64:
|
||||
return pthreadOnceSizeLinuxAmd64, pthreadMutexSizeLinuxAmd64, pthreadMutexAttrSizeLinuxAmd64,
|
||||
pthreadCondSizeLinuxAmd64, pthreadCondAttrSizeLinuxAmd64, pthreadRWLockSizeLinuxAmd64, pthreadRWLockAttrSizeLinuxAmd64
|
||||
case linuxArm64:
|
||||
return pthreadOnceSizeLinuxArm64, pthreadMutexSizeLinuxArm64, pthreadMutexAttrSizeLinuxArm64,
|
||||
pthreadCondSizeLinuxArm64, pthreadCondAttrSizeLinuxArm64, pthreadRWLockSizeLinuxArm64, pthreadRWLockAttrSizeLinuxArm64
|
||||
case darwinAmd64:
|
||||
return pthreadOnceSizeDarwinAmd64, pthreadMutexSizeDarwinAmd64, pthreadMutexAttrSizeDarwinAmd64,
|
||||
pthreadCondSizeDarwinAmd64, pthreadCondAttrSizeDarwinAmd64, pthreadRWLockSizeDarwinAmd64, pthreadRWLockAttrSizeDarwinAmd64
|
||||
case darwinArm64:
|
||||
return pthreadOnceSizeDarwinArm64, pthreadMutexSizeDarwinArm64, pthreadMutexAttrSizeDarwinArm64,
|
||||
pthreadCondSizeDarwinArm64, pthreadCondAttrSizeDarwinArm64, pthreadRWLockSizeDarwinArm64, pthreadRWLockAttrSizeDarwinArm64
|
||||
default:
|
||||
panic("Unsupported platform: " + runtime.GOOS + ", " + runtime.GOARCH)
|
||||
}
|
||||
}
|
||||
|
||||
func getPlatformClockSizes() (clockSize int) {
|
||||
switch {
|
||||
case linuxAmd64:
|
||||
return clockSizeLinuxAmd64
|
||||
case linuxArm64:
|
||||
return clockSizeLinuxArm64
|
||||
case darwinAmd64:
|
||||
return clockSizeDarwinAmd64
|
||||
case darwinArm64:
|
||||
return clockSizeDarwinArm64
|
||||
default:
|
||||
panic("Unsupported platform: " + runtime.GOOS + ", " + runtime.GOARCH)
|
||||
}
|
||||
}
|
||||
|
||||
func getPlatformJmpBufSizes() (sigjmpBufSize, jmpBufSize int) {
|
||||
switch {
|
||||
case linuxAmd64:
|
||||
return sigjmpBufSizeLinuxAmd64, jmpBufSizeLinuxAmd64
|
||||
case linuxArm64:
|
||||
return sigjmpBufSizeLinuxArm64, jmpBufSizeLinuxArm64
|
||||
case darwinAmd64:
|
||||
return sigjmpBufSizeDarwinAmd64, jmpBufSizeDarwinAmd64
|
||||
case darwinArm64:
|
||||
return sigjmpBufSizeDarwinArm64, jmpBufSizeDarwinArm64
|
||||
default:
|
||||
panic("Unsupported platform: " + runtime.GOOS + ", " + runtime.GOARCH)
|
||||
}
|
||||
}
|
||||
|
||||
func max(a int, others ...int) int {
|
||||
max := a
|
||||
for _, v := range others {
|
||||
if v > max {
|
||||
max = v
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
||||
|
||||
var (
|
||||
pthreadOnceSize = max(pthreadOnceSizeLinuxAmd64, pthreadOnceSizeDarwinAmd64, pthreadOnceSizeLinuxArm64, pthreadOnceSizeDarwinArm64)
|
||||
pthreadMutexSize = max(pthreadMutexSizeLinuxAmd64, pthreadMutexSizeLinuxArm64, pthreadMutexSizeDarwinAmd64, pthreadMutexSizeDarwinArm64)
|
||||
pthreadMutexAttrSize = max(pthreadMutexAttrSizeLinuxAmd64, pthreadMutexAttrSizeLinuxArm64, pthreadMutexAttrSizeDarwinAmd64, pthreadMutexAttrSizeDarwinArm64)
|
||||
pthreadCondSize = max(pthreadCondSizeLinuxAmd64, pthreadCondSizeLinuxArm64, pthreadCondSizeDarwinAmd64, pthreadCondSizeDarwinArm64)
|
||||
pthreadCondAttrSize = max(pthreadCondAttrSizeLinuxAmd64, pthreadCondAttrSizeLinuxArm64, pthreadCondAttrSizeDarwinAmd64, pthreadCondAttrSizeDarwinArm64)
|
||||
pthreadRWLockSize = max(pthreadRWLockSizeLinuxAmd64, pthreadRWLockSizeLinuxArm64, pthreadRWLockSizeDarwinAmd64, pthreadRWLockSizeDarwinArm64)
|
||||
pthreadRWLockAttrSize = max(pthreadRWLockAttrSizeLinuxAmd64, pthreadRWLockAttrSizeLinuxArm64, pthreadRWLockAttrSizeDarwinAmd64, pthreadRWLockAttrSizeDarwinArm64)
|
||||
clockSize = max(clockSizeLinuxAmd64, clockSizeLinuxArm64, clockSizeDarwinAmd64, clockSizeDarwinArm64)
|
||||
sigjmpBufSize = max(sigjmpBufSizeLinuxAmd64, sigjmpBufSizeLinuxArm64, sigjmpBufSizeDarwinAmd64, sigjmpBufSizeDarwinArm64)
|
||||
jmpBufSize = max(jmpBufSizeLinuxAmd64, jmpBufSizeLinuxArm64, jmpBufSizeDarwinAmd64, jmpBufSizeDarwinArm64)
|
||||
)
|
||||
Reference in New Issue
Block a user