| // 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. |
| |
| #include "runtime.h" |
| #include "defs_GOOS_GOARCH.h" |
| #include "arch_GOARCH.h" |
| #include "malloc.h" |
| #include "os_GOOS.h" |
| |
| extern byte end[]; |
| static byte *bloc = { end }; |
| static Lock memlock; |
| |
| enum |
| { |
| Round = PAGESIZE-1 |
| }; |
| |
| void* |
| runtime·SysAlloc(uintptr nbytes, uint64 *stat) |
| { |
| uintptr bl; |
| |
| runtime·lock(&memlock); |
| // Plan 9 sbrk from /sys/src/libc/9sys/sbrk.c |
| bl = ((uintptr)bloc + Round) & ~Round; |
| if(runtime·brk_((void*)(bl + nbytes)) < 0) { |
| runtime·unlock(&memlock); |
| return nil; |
| } |
| bloc = (byte*)bl + nbytes; |
| runtime·unlock(&memlock); |
| runtime·xadd64(stat, nbytes); |
| return (void*)bl; |
| } |
| |
| void |
| runtime·SysFree(void *v, uintptr nbytes, uint64 *stat) |
| { |
| runtime·xadd64(stat, -(uint64)nbytes); |
| runtime·lock(&memlock); |
| // from tiny/mem.c |
| // Push pointer back if this is a free |
| // of the most recent SysAlloc. |
| nbytes += (nbytes + Round) & ~Round; |
| if(bloc == (byte*)v+nbytes) |
| bloc -= nbytes; |
| runtime·unlock(&memlock); |
| } |
| |
| void |
| runtime·SysUnused(void *v, uintptr nbytes) |
| { |
| USED(v, nbytes); |
| } |
| |
| void |
| runtime·SysUsed(void *v, uintptr nbytes) |
| { |
| USED(v, nbytes); |
| } |
| |
| void |
| runtime·SysMap(void *v, uintptr nbytes, bool reserved, uint64 *stat) |
| { |
| USED(v, nbytes, reserved, stat); |
| } |
| |
| void |
| runtime·SysFault(void *v, uintptr nbytes) |
| { |
| USED(v, nbytes); |
| } |
| |
| void* |
| runtime·SysReserve(void *v, uintptr nbytes, bool *reserved) |
| { |
| USED(v); |
| *reserved = true; |
| return runtime·SysAlloc(nbytes, &mstats.heap_sys); |
| } |