Browse Source
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.
pull/91/head
Ayke van Laethem
6 years ago
No known key found for this signature in database
GPG Key ID: E97FF5335DFDFDED
5 changed files with
27 additions and
4 deletions
src/runtime/arch_avr.go
src/runtime/arch_tinygoarm.go
src/runtime/arch_wasm.go
src/runtime/gc_dumb.go
src/runtime/runtime_unix.go
@ -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