runtime: add "end of heap" to detect out of memory
This can be used in the future to trigger garbage collection. For now, it provides a more useful error message in case the heap is completely filled up.
Этот коммит содержится в:
родитель
ef93001ab8
коммит
9181f2d4ce
5 изменённых файлов: 27 добавлений и 4 удалений
|
@ -14,7 +14,13 @@ const TargetBits = 8
|
|||
//go:extern _heap_start
|
||||
var heapStartSymbol unsafe.Pointer
|
||||
|
||||
var heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
//go:extern _heap_end
|
||||
var heapEndSymbol unsafe.Pointer
|
||||
|
||||
var (
|
||||
heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
heapEnd = uintptr(unsafe.Pointer(&heapEndSymbol))
|
||||
)
|
||||
|
||||
// Align on a word boundary.
|
||||
func align(ptr uintptr) uintptr {
|
||||
|
|
|
@ -14,7 +14,13 @@ const TargetBits = 32
|
|||
//go:extern _heap_start
|
||||
var heapStartSymbol unsafe.Pointer
|
||||
|
||||
var heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
//go:extern _heap_end
|
||||
var heapEndSymbol unsafe.Pointer
|
||||
|
||||
var (
|
||||
heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
heapEnd = uintptr(unsafe.Pointer(&heapEndSymbol))
|
||||
)
|
||||
|
||||
// Align on word boundary.
|
||||
func align(ptr uintptr) uintptr {
|
||||
|
|
|
@ -14,7 +14,12 @@ const TargetBits = 32
|
|||
//go:extern __heap_base
|
||||
var heapStartSymbol unsafe.Pointer
|
||||
|
||||
var heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
var (
|
||||
heapStart = uintptr(unsafe.Pointer(&heapStartSymbol))
|
||||
heapEnd = (heapStart + wasmPageSize - 1) & (wasmPageSize - 1) // conservative guess: one page of heap memory
|
||||
)
|
||||
|
||||
const wasmPageSize = 64 * 1024
|
||||
|
||||
// Align on word boundary.
|
||||
func align(ptr uintptr) uintptr {
|
||||
|
|
|
@ -20,6 +20,9 @@ func alloc(size uintptr) unsafe.Pointer {
|
|||
size = align(size)
|
||||
addr := heapptr
|
||||
heapptr += size
|
||||
if heapptr >= heapEnd {
|
||||
runtimePanic("out of memory")
|
||||
}
|
||||
for i := uintptr(0); i < uintptr(size); i += 4 {
|
||||
ptr := (*uint32)(unsafe.Pointer(addr + i))
|
||||
*ptr = 0
|
||||
|
|
|
@ -14,7 +14,10 @@ func _Cfunc_clock_gettime(clk_id uint, ts *timespec)
|
|||
|
||||
const heapSize = 1 * 1024 * 1024 // 1MB to start
|
||||
|
||||
var heapStart = uintptr(_Cfunc_malloc(heapSize))
|
||||
var (
|
||||
heapStart = uintptr(_Cfunc_malloc(heapSize))
|
||||
heapEnd = heapStart + heapSize
|
||||
)
|
||||
|
||||
type timeUnit int64
|
||||
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче