// Copyright 2010 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package runtime

import "unsafe"

var bloc uintptr
var memlock mutex

func memRound(p uintptr) uintptr {
	return (p + _PAGESIZE - 1) &^ (_PAGESIZE - 1)
}

func initBloc() {
	bloc = memRound(uintptr(unsafe.Pointer(&end)))
}

func sbrk(n uintptr) unsafe.Pointer {
	lock(&memlock)
	// Plan 9 sbrk from /sys/src/libc/9sys/sbrk.c
	bl := bloc
	n = memRound(n)
	if brk_(unsafe.Pointer(bl+n)) < 0 {
		unlock(&memlock)
		return nil
	}
	bloc += n
	unlock(&memlock)
	return unsafe.Pointer(bl)
}

func sysAlloc(n uintptr, stat *uint64) unsafe.Pointer {
	p := sbrk(n)
	if p != nil {
		xadd64(stat, int64(n))
	}
	return p
}

func sysFree(v unsafe.Pointer, n uintptr, stat *uint64) {
	xadd64(stat, -int64(n))
	lock(&memlock)
	// from tiny/mem.c
	// Push pointer back if this is a free
	// of the most recent sysAlloc.
	n = memRound(n)
	if bloc == uintptr(v)+n {
		bloc -= n
		memclr(unsafe.Pointer(bloc), n)
	}
	unlock(&memlock)
}

func sysUnused(v unsafe.Pointer, n uintptr) {
}

func sysUsed(v unsafe.Pointer, n uintptr) {
}

func sysMap(v unsafe.Pointer, n uintptr, reserved bool, stat *uint64) {
	// sysReserve has already allocated all heap memory,
	// but has not adjusted stats.
	xadd64(stat, int64(n))
}

func sysFault(v unsafe.Pointer, n uintptr) {
}

func sysReserve(v unsafe.Pointer, n uintptr, reserved *bool) unsafe.Pointer {
	*reserved = true
	return sbrk(n)
}
