This source file includes following definitions.
- runtimeツキSysAlloc
- runtimeツキSysUnused
- runtimeツキSysUsed
- runtimeツキSysFree
- runtimeツキSysFault
- runtimeツキSysReserve
- runtimeツキSysMap
#include "runtime.h"
#include "arch_GOARCH.h"
#include "defs_GOOS_GOARCH.h"
#include "os_GOOS.h"
#include "malloc.h"
enum
{
Debug = 0,
};
void*
runtimeツキSysAlloc(uintptr n, uint64 *stat)
{
void *v;
v = runtimeツキmmap(nil, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(v < (void*)4096) {
if(Debug)
runtimeツキprintf("SysAlloc(%p): %p\n", n, v);
return nil;
}
runtimeツキxadd64(stat, n);
if(Debug)
runtimeツキprintf("SysAlloc(%p) = %p\n", n, v);
return v;
}
void
runtimeツキSysUnused(void *v, uintptr n)
{
if(Debug)
runtimeツキprintf("SysUnused(%p, %p)\n", v, n);
}
void
runtimeツキSysUsed(void *v, uintptr n)
{
USED(v);
USED(n);
}
void
runtimeツキSysFree(void *v, uintptr n, uint64 *stat)
{
if(Debug)
runtimeツキprintf("SysFree(%p, %p)\n", v, n);
runtimeツキxadd64(stat, -(uint64)n);
runtimeツキmunmap(v, n);
}
void
runtimeツキSysFault(void *v, uintptr n)
{
runtimeツキmmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
}
void*
runtimeツキSysReserve(void *v, uintptr n, bool *reserved)
{
void *p;
if(NaCl || sizeof(void*) == 8) {
*reserved = false;
return v;
}
p = runtimeツキmmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(p < (void*)4096)
return nil;
*reserved = true;
return p;
}
void
runtimeツキSysMap(void *v, uintptr n, bool reserved, uint64 *stat)
{
void *p;
runtimeツキxadd64(stat, n);
if(!reserved) {
p = runtimeツキmmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0);
if(p == (void*)ENOMEM) {
runtimeツキprintf("SysMap(%p, %p): %p\n", v, n, p);
runtimeツキthrow("runtime: out of memory");
}
if(p != v) {
runtimeツキprintf("SysMap(%p, %p): %p\n", v, n, p);
runtimeツキprintf("runtime: address space conflict: map(%p) = %p\n", v, p);
runtimeツキthrow("runtime: address space conflict");
}
if(Debug)
runtimeツキprintf("SysMap(%p, %p) = %p\n", v, n, p);
return;
}
p = runtimeツキmmap(v, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
if(p == (void*)ENOMEM) {
runtimeツキprintf("SysMap(%p, %p): %p\n", v, n, p);
runtimeツキthrow("runtime: out of memory");
}
if(p != v) {
runtimeツキprintf("SysMap(%p, %p): %p\n", v, n, p);
runtimeツキprintf("mmap MAP_FIXED %p returned %p\n", v, p);
runtimeツキthrow("runtime: cannot map pages in arena address space");
}
if(Debug)
runtimeツキprintf("SysMap(%p, %p) = %p\n", v, n, p);
}