31 строка
650 Б
Go
31 строка
650 Б
Go
|
|
// +build !linux
|
|
|
|
package runtime
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
_extern__heap_start unsafe.Pointer // defined by the linker
|
|
heapptr = uintptr(unsafe.Pointer(&_extern__heap_start))
|
|
)
|
|
|
|
func alloc(size uintptr) unsafe.Pointer {
|
|
// TODO: this can be optimized by not casting between pointers and ints so
|
|
// much. And by using platform-native data types (e.g. *uint8 for 8-bit
|
|
// systems).
|
|
size = align(size)
|
|
addr := heapptr
|
|
heapptr += size
|
|
for i := uintptr(0); i < uintptr(size); i += 4 {
|
|
ptr := (*uint32)(unsafe.Pointer(addr + i))
|
|
*ptr = 0
|
|
}
|
|
return unsafe.Pointer(addr)
|
|
}
|
|
|
|
func free(ptr unsafe.Pointer) {
|
|
// TODO: use a GC
|
|
}
|